• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&lt;T&gt;) => 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&lt;T&gt; | 否 | 当前调用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&lt;T&gt;
320
321返回一个迭代器,迭代器的每一项都是一个JavaScript对象。
322
323**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
324
325**系统能力:** SystemCapability.Utils.Lang
326
327**返回值:**
328
329| 类型 | 说明 |
330| -------- | -------- |
331| IterableIterator&lt;T&gt; | 返回一个迭代器。 |
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```