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