1# @ohos.util.Stack (线性容器Stack) 2<!--Kit: ArkTS--> 3<!--Subsystem: CommonLibrary--> 4<!--Owner: @xliu-huanwei; @shilei123; @huanghello--> 5<!--Designer: @yuanyao14--> 6<!--Tester: @kirl75; @zsw_zhushiwei--> 7<!--Adviser: @ge-yafang--> 8 9Stack基于数组的数据结构实现,特点是先进后出,只能在一端进行数据的插入和删除。 10 11Stack和[Queue](js-apis-queue.md)相比,Queue基于循环队列实现,只能在一端删除另一端插入,而Stack都在一端操作。 12 13**推荐使用场景:** 一般符合先进后出的场景可以使用Stack。 14 15文档中使用了泛型,涉及以下泛型标记符: 16- T:Type,类 17 18> **说明:** 19> 20> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 21> 22> 容器类使用静态语言实现,限制了存储位置和属性,不支持自定义属性和方法。 23 24 25## 导入模块 26 27```ts 28import { Stack } from '@kit.ArkTS'; 29``` 30 31## Stack 32 33### 属性 34 35**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 36 37**系统能力:** SystemCapability.Utils.Lang 38 39| 名称 | 类型 | 只读 | 可选 | 说明 | 40| -------- | -------- | -------- | -------- | -------- | 41| length | number | 是 | 否 | Stack的元素个数。 | 42 43 44### constructor 45 46constructor() 47 48Stack的构造函数。 49 50**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 51 52**系统能力:** SystemCapability.Utils.Lang 53 54**错误码:** 55 56以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 57 58| 错误码ID | 错误信息 | 59| -------- | -------- | 60| 10200012 | The Stack's constructor cannot be directly invoked. | 61 62**示例:** 63 64```ts 65let stack = new Stack<number | string | Object>(); 66``` 67 68 69### push 70 71push(item: T): T 72 73在栈顶插入元素,并返回该元素。 74 75**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 76 77**系统能力:** SystemCapability.Utils.Lang 78 79**参数:** 80 81| 参数名 | 类型 | 必填 | 说明 | 82| -------- | -------- | -------- | -------- | 83| item | T | 是 | 添加进去的元素。 | 84 85**返回值:** 86 87| 类型 | 说明 | 88| -------- | -------- | 89| T | 返回被添加进去的元素。 | 90 91**错误码:** 92 93以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 94 95| 错误码ID | 错误信息 | 96| -------- | -------- | 97| 10200011 | The push method cannot be bound. | 98 99**示例:** 100 101```ts 102class C1 { 103 name: string = "" 104 age: string = "" 105} 106let stack = new Stack<number | string | C1>(); 107let result = stack.push("a"); 108let result1 = stack.push(1); 109let c : C1 = {name : "Dylan", age : "13"}; 110let result2 = stack.push(c); 111console.info("length:", stack.length); // length: 3 112``` 113 114### pop 115 116pop(): T 117 118删除栈顶元素并返回,栈为空时返回undefined。 119 120**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 121 122**系统能力:** SystemCapability.Utils.Lang 123 124**返回值:** 125 126| 类型 | 说明 | 127| -------- | -------- | 128| T | 返回栈顶元素,栈为空时返回undefined。 | 129 130**错误码:** 131 132以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 133 134| 错误码ID | 错误信息 | 135| -------- | -------- | 136| 10200011 | The pop method cannot be bound. | 137 138**示例:** 139 140```ts 141let stack = new Stack<number>(); 142stack.push(2); 143stack.push(4); 144stack.push(5); 145stack.push(2); 146stack.push(4); 147let result = stack.pop(); 148console.info("result = " + result); // result = 4 149``` 150 151### peek 152 153peek(): T 154 155返回栈顶元素。 156 157**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 158 159**系统能力:** SystemCapability.Utils.Lang 160 161**返回值:** 162 163| 类型 | 说明 | 164| -------- | -------- | 165| T | 返回栈顶元素。 | 166 167**错误码:** 168 169以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 170 171| 错误码ID | 错误信息 | 172| -------- | -------- | 173| 10200011 | The peek method cannot be bound. | 174 175**示例:** 176 177```ts 178let stack = new Stack<number>(); 179stack.push(2); 180stack.push(4); 181stack.push(5); 182stack.push(2); 183let result = stack.peek(); 184console.info("result:", result); // result: 2 185``` 186 187### locate 188 189locate(element: T): number 190 191查找指定元素首次出现的下标值,查找失败则返回-1。 192 193**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 194 195**系统能力:** SystemCapability.Utils.Lang 196 197**参数:** 198 199| 参数名 | 类型 | 必填 | 说明 | 200| -------- | -------- | -------- | -------- | 201| element | T | 是 | 指定元素。 | 202 203**返回值:** 204 205| 类型 | 说明 | 206| -------- | -------- | 207| number | 对应元素下标值,查找失败则返回-1。 | 208 209**错误码:** 210 211以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 212 213| 错误码ID | 错误信息 | 214| -------- | -------- | 215| 10200011 | The locate method cannot be bound. | 216 217**示例:** 218 219```ts 220let stack = new Stack<number>(); 221stack.push(2); 222stack.push(4); 223stack.push(5); 224stack.push(2); 225let result = stack.locate(5); 226console.info("result:", result); // result: 2 227``` 228 229### forEach 230 231forEach(callbackFn: (value: T, index?: number, stack?: Stack<T>) => void, 232thisArg?: Object): void 233 234在遍历Stack实例对象中每一个元素的过程中,对每个元素执行回调函数。 235 236**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 237 238**系统能力:** SystemCapability.Utils.Lang 239 240**参数:** 241 242| 参数名 | 类型 | 必填 | 说明 | 243| -------- | -------- | -------- | -------- | 244| callbackFn | function | 是 | 回调函数。 | 245| thisArg | Object | 否 | callbackFn被调用时用作this值,默认值为当前实例对象。 | 246 247callbackFn的参数说明: 248 249| 参数名 | 类型 | 必填 | 说明 | 250| -------- | -------- | -------- | -------- | 251| value | T | 是 | 当前遍历到的元素。 | 252| index | number | 否 | 当前遍历到的下标值,默认值为0。 | 253| stack | Stack<T> | 否 | 当前调用forEach方法的实例对象,默认值为当前实例对象。 | 254 255**错误码:** 256 257以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 258 259| 错误码ID | 错误信息 | 260| -------- | -------- | 261| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. | 262| 10200011 | The forEach method cannot be bound. | 263 264**示例:** 265 266```ts 267let stack = new Stack<number>(); 268stack.push(2); 269stack.push(4); 270stack.push(5); 271stack.push(4); 272stack.forEach((value : number, index: number) :void => { 273 console.info("value:" + value, "index:" + index); 274}); 275// value:2 index:0 276// value:4 index:1 277// value:5 index:2 278// value:4 index:3 279``` 280 281### isEmpty 282 283isEmpty(): boolean 284 285判断栈是否为空。 286 287**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 288 289**系统能力:** SystemCapability.Utils.Lang 290 291**返回值:** 292 293| 类型 | 说明 | 294| -------- | -------- | 295| boolean | 为空返回true,不为空返回false。 | 296 297**错误码:** 298 299以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 300 301| 错误码ID | 错误信息 | 302| -------- | -------- | 303| 10200011 | The isEmpty method cannot be bound. | 304 305**示例:** 306 307```ts 308let stack = new Stack<number>(); 309stack.push(2); 310stack.push(4); 311stack.push(5); 312stack.push(4); 313let result = stack.isEmpty(); 314console.info("result:", result); // result: false 315``` 316 317### [Symbol.iterator] 318 319[Symbol.iterator]\(): IterableIterator<T> 320 321返回一个迭代器,迭代器的每一项都是一个JavaScript对象。 322 323**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 324 325**系统能力:** SystemCapability.Utils.Lang 326 327**返回值:** 328 329| 类型 | 说明 | 330| -------- | -------- | 331| IterableIterator<T> | 返回一个迭代器。 | 332 333**错误码:** 334 335以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 336 337| 错误码ID | 错误信息 | 338| -------- | -------- | 339| 10200011 | The Symbol.iterator method cannot be bound. | 340 341**示例:** 342```ts 343let stack = new Stack<number>(); 344stack.push(2); 345stack.push(4); 346stack.push(5); 347stack.push(4); 348 349// 使用方法一: 350for (let value of stack) { 351 console.info("value:", value); 352} 353// value: 2 354// value: 4 355// value: 5 356// value: 4 357 358// 使用方法二: 359let iter = stack[Symbol.iterator](); 360let temp: IteratorResult<number> = iter.next().value; 361while(temp != undefined) { 362 console.info("value: " + temp); 363 temp = iter.next().value; 364} 365// value: 2 366// value: 4 367// value: 5 368// value: 4 369```