1e41f4b71Sopenharmony_ci# @ohos.util.Stack (Linear Container Stack)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci**Stack** is implemented based on the array data structure. It follows the principle Last Out First In (LOFI) and supports data insertion and removal at one end.
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ciUnlike **[Queue](js-apis-queue.md)**, which is implemented based on the queue data structure and supports insertion at one end and removal at the other end, **Stack** supports insertion and removal at the same end.
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci**Recommended use case**: Use **Stack** in LOFI scenarios.
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ciThis topic uses the following to identify the use of generics:
10e41f4b71Sopenharmony_ci- T: Type
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci> **NOTE**
13e41f4b71Sopenharmony_ci>
14e41f4b71Sopenharmony_ci> The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version.
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci## Modules to Import
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci```ts
20e41f4b71Sopenharmony_ciimport { Stack } from '@kit.ArkTS';
21e41f4b71Sopenharmony_ci```
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci## Stack
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci### Attributes
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci| Name| Type| Readable| Writable| Description|
32e41f4b71Sopenharmony_ci| -------- | -------- | -------- | -------- | -------- |
33e41f4b71Sopenharmony_ci| length | number | Yes| No| Number of elements in a stack (called container later).|
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci
36e41f4b71Sopenharmony_ci### constructor
37e41f4b71Sopenharmony_ci
38e41f4b71Sopenharmony_ciconstructor()
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_ciA constructor used to create a **Stack** instance.
41e41f4b71Sopenharmony_ci
42e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
45e41f4b71Sopenharmony_ci
46e41f4b71Sopenharmony_ci**Error codes**
47e41f4b71Sopenharmony_ci
48e41f4b71Sopenharmony_ciFor details about the error codes, see [Utils Error Codes](errorcode-utils.md).
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci| ID| Error Message|
51e41f4b71Sopenharmony_ci| -------- | -------- |
52e41f4b71Sopenharmony_ci| 10200012 | The Stack's constructor cannot be directly invoked. |
53e41f4b71Sopenharmony_ci
54e41f4b71Sopenharmony_ci**Example**
55e41f4b71Sopenharmony_ci
56e41f4b71Sopenharmony_ci```ts
57e41f4b71Sopenharmony_cilet stack : Stack<number | string | Object> = new Stack();
58e41f4b71Sopenharmony_ci```
59e41f4b71Sopenharmony_ci
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_ci### push
62e41f4b71Sopenharmony_ci
63e41f4b71Sopenharmony_cipush(item: T): T
64e41f4b71Sopenharmony_ci
65e41f4b71Sopenharmony_ciAdds an element at the top of this container.
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ci**Parameters**
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ci| Name| Type| Mandatory| Description|
74e41f4b71Sopenharmony_ci| -------- | -------- | -------- | -------- |
75e41f4b71Sopenharmony_ci| item | T | Yes| Target element.|
76e41f4b71Sopenharmony_ci
77e41f4b71Sopenharmony_ci**Return value**
78e41f4b71Sopenharmony_ci
79e41f4b71Sopenharmony_ci| Type| Description|
80e41f4b71Sopenharmony_ci| -------- | -------- |
81e41f4b71Sopenharmony_ci| T | Element added.|
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ci**Error codes**
84e41f4b71Sopenharmony_ci
85e41f4b71Sopenharmony_ciFor details about the error codes, see [Utils Error Codes](errorcode-utils.md).
86e41f4b71Sopenharmony_ci
87e41f4b71Sopenharmony_ci| ID| Error Message|
88e41f4b71Sopenharmony_ci| -------- | -------- |
89e41f4b71Sopenharmony_ci| 10200011 | The push method cannot be bound. |
90e41f4b71Sopenharmony_ci
91e41f4b71Sopenharmony_ci**Example**
92e41f4b71Sopenharmony_ci
93e41f4b71Sopenharmony_ci```
94e41f4b71Sopenharmony_ciclass C1 {
95e41f4b71Sopenharmony_ci  name: string = ""
96e41f4b71Sopenharmony_ci  age: string = ""
97e41f4b71Sopenharmony_ci}
98e41f4b71Sopenharmony_cilet stack : Stack<number | string | C1> = new Stack();
99e41f4b71Sopenharmony_cilet result = stack.push("a");
100e41f4b71Sopenharmony_cilet result1 = stack.push(1);
101e41f4b71Sopenharmony_cilet c : C1  = {name : "Dylan", age : "13"};
102e41f4b71Sopenharmony_cilet result2 = stack.push(c);
103e41f4b71Sopenharmony_ci```
104e41f4b71Sopenharmony_ci
105e41f4b71Sopenharmony_ci### pop
106e41f4b71Sopenharmony_ci
107e41f4b71Sopenharmony_cipop(): T
108e41f4b71Sopenharmony_ci
109e41f4b71Sopenharmony_ciRemoves the top element from this container.
110e41f4b71Sopenharmony_ci
111e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
112e41f4b71Sopenharmony_ci
113e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
114e41f4b71Sopenharmony_ci
115e41f4b71Sopenharmony_ci**Return value**
116e41f4b71Sopenharmony_ci
117e41f4b71Sopenharmony_ci| Type| Description|
118e41f4b71Sopenharmony_ci| -------- | -------- |
119e41f4b71Sopenharmony_ci| T | Element removed. If the container is empty, **undefined** is returned.|
120e41f4b71Sopenharmony_ci
121e41f4b71Sopenharmony_ci**Error codes**
122e41f4b71Sopenharmony_ci
123e41f4b71Sopenharmony_ciFor details about the error codes, see [Utils Error Codes](errorcode-utils.md).
124e41f4b71Sopenharmony_ci
125e41f4b71Sopenharmony_ci| ID| Error Message|
126e41f4b71Sopenharmony_ci| -------- | -------- |
127e41f4b71Sopenharmony_ci| 10200011 | The pop method cannot be bound. |
128e41f4b71Sopenharmony_ci
129e41f4b71Sopenharmony_ci**Example**
130e41f4b71Sopenharmony_ci
131e41f4b71Sopenharmony_ci```ts
132e41f4b71Sopenharmony_cilet stack : Stack<number> = new Stack();
133e41f4b71Sopenharmony_cistack.push(2);
134e41f4b71Sopenharmony_cistack.push(4);
135e41f4b71Sopenharmony_cistack.push(5);
136e41f4b71Sopenharmony_cistack.push(2);
137e41f4b71Sopenharmony_cistack.push(4);
138e41f4b71Sopenharmony_cilet result = stack.pop();
139e41f4b71Sopenharmony_ci```
140e41f4b71Sopenharmony_ci
141e41f4b71Sopenharmony_ci### peek
142e41f4b71Sopenharmony_ci
143e41f4b71Sopenharmony_cipeek(): T
144e41f4b71Sopenharmony_ci
145e41f4b71Sopenharmony_ciObtains the top element of this container.
146e41f4b71Sopenharmony_ci
147e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
148e41f4b71Sopenharmony_ci
149e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
150e41f4b71Sopenharmony_ci
151e41f4b71Sopenharmony_ci**Return value**
152e41f4b71Sopenharmony_ci
153e41f4b71Sopenharmony_ci| Type| Description|
154e41f4b71Sopenharmony_ci| -------- | -------- |
155e41f4b71Sopenharmony_ci| T | Element obtained.|
156e41f4b71Sopenharmony_ci
157e41f4b71Sopenharmony_ci**Error codes**
158e41f4b71Sopenharmony_ci
159e41f4b71Sopenharmony_ciFor details about the error codes, see [Utils Error Codes](errorcode-utils.md).
160e41f4b71Sopenharmony_ci
161e41f4b71Sopenharmony_ci| ID| Error Message|
162e41f4b71Sopenharmony_ci| -------- | -------- |
163e41f4b71Sopenharmony_ci| 10200011 | The peek method cannot be bound. |
164e41f4b71Sopenharmony_ci
165e41f4b71Sopenharmony_ci**Example**
166e41f4b71Sopenharmony_ci
167e41f4b71Sopenharmony_ci```ts
168e41f4b71Sopenharmony_cilet stack : Stack<number> = new Stack();
169e41f4b71Sopenharmony_cistack.push(2);
170e41f4b71Sopenharmony_cistack.push(4);
171e41f4b71Sopenharmony_cistack.push(5);
172e41f4b71Sopenharmony_cistack.push(2);
173e41f4b71Sopenharmony_cilet result = stack.peek();
174e41f4b71Sopenharmony_ci```
175e41f4b71Sopenharmony_ci
176e41f4b71Sopenharmony_ci### locate
177e41f4b71Sopenharmony_ci
178e41f4b71Sopenharmony_cilocate(element: T): number
179e41f4b71Sopenharmony_ci
180e41f4b71Sopenharmony_ciObtains the index of the first occurrence of the specified element in this container.
181e41f4b71Sopenharmony_ci
182e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
183e41f4b71Sopenharmony_ci
184e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
185e41f4b71Sopenharmony_ci
186e41f4b71Sopenharmony_ci**Parameters**
187e41f4b71Sopenharmony_ci
188e41f4b71Sopenharmony_ci| Name| Type| Mandatory| Description|
189e41f4b71Sopenharmony_ci| -------- | -------- | -------- | -------- |
190e41f4b71Sopenharmony_ci| element | T | Yes| Target element.|
191e41f4b71Sopenharmony_ci
192e41f4b71Sopenharmony_ci**Return value**
193e41f4b71Sopenharmony_ci
194e41f4b71Sopenharmony_ci| Type| Description|
195e41f4b71Sopenharmony_ci| -------- | -------- |
196e41f4b71Sopenharmony_ci| number | Index of the first occurrence of the specified element. If the element does not exist, **-1** is returned.|
197e41f4b71Sopenharmony_ci
198e41f4b71Sopenharmony_ci**Error codes**
199e41f4b71Sopenharmony_ci
200e41f4b71Sopenharmony_ciFor details about the error codes, see [Utils Error Codes](errorcode-utils.md).
201e41f4b71Sopenharmony_ci
202e41f4b71Sopenharmony_ci| ID| Error Message|
203e41f4b71Sopenharmony_ci| -------- | -------- |
204e41f4b71Sopenharmony_ci| 10200011 | The locate method cannot be bound. |
205e41f4b71Sopenharmony_ci
206e41f4b71Sopenharmony_ci**Example**
207e41f4b71Sopenharmony_ci
208e41f4b71Sopenharmony_ci```ts
209e41f4b71Sopenharmony_cilet stack : Stack<number> = new Stack();
210e41f4b71Sopenharmony_cistack.push(2);
211e41f4b71Sopenharmony_cistack.push(4);
212e41f4b71Sopenharmony_cistack.push(5);
213e41f4b71Sopenharmony_cistack.push(2);
214e41f4b71Sopenharmony_cilet result = stack.locate(2);
215e41f4b71Sopenharmony_ci```
216e41f4b71Sopenharmony_ci
217e41f4b71Sopenharmony_ci### forEach
218e41f4b71Sopenharmony_ci
219e41f4b71Sopenharmony_ciforEach(callbackFn: (value: T, index?: number, stack?: Stack&lt;T&gt;) => void,
220e41f4b71Sopenharmony_cithisArg?: Object): void
221e41f4b71Sopenharmony_ci
222e41f4b71Sopenharmony_ciUses a callback to traverse the elements in this container and obtain their position indexes.
223e41f4b71Sopenharmony_ci
224e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
225e41f4b71Sopenharmony_ci
226e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
227e41f4b71Sopenharmony_ci
228e41f4b71Sopenharmony_ci**Parameters**
229e41f4b71Sopenharmony_ci
230e41f4b71Sopenharmony_ci| Name| Type| Mandatory| Description|
231e41f4b71Sopenharmony_ci| -------- | -------- | -------- | -------- |
232e41f4b71Sopenharmony_ci| callbackFn | function | Yes| Callback invoked to traverse the elements in the container.|
233e41f4b71Sopenharmony_ci| thisArg | Object | No| Value of **this** to use when **callbackFn** is invoked. The default value is this instance.|
234e41f4b71Sopenharmony_ci
235e41f4b71Sopenharmony_cicallbackFn
236e41f4b71Sopenharmony_ci
237e41f4b71Sopenharmony_ci| Name| Type| Mandatory| Description|
238e41f4b71Sopenharmony_ci| -------- | -------- | -------- | -------- |
239e41f4b71Sopenharmony_ci| value | T | Yes| Value of the element that is currently traversed.|
240e41f4b71Sopenharmony_ci| index | number | No| Position index of the element that is currently traversed. The default value is **0**.|
241e41f4b71Sopenharmony_ci| stack | Stack&lt;T&gt; | No| Instance that calls the **forEach** API. The default value is this instance.|
242e41f4b71Sopenharmony_ci
243e41f4b71Sopenharmony_ci**Error codes**
244e41f4b71Sopenharmony_ci
245e41f4b71Sopenharmony_ciFor details about the error codes, see [Universal Error Codes](../errorcode-universal.md) and [Utils Error Codes](errorcode-utils.md).
246e41f4b71Sopenharmony_ci
247e41f4b71Sopenharmony_ci| ID| Error Message|
248e41f4b71Sopenharmony_ci| -------- | -------- |
249e41f4b71Sopenharmony_ci| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. |
250e41f4b71Sopenharmony_ci| 10200011 | The forEach method cannot be bound. |
251e41f4b71Sopenharmony_ci
252e41f4b71Sopenharmony_ci**Example**
253e41f4b71Sopenharmony_ci
254e41f4b71Sopenharmony_ci```ts
255e41f4b71Sopenharmony_cilet stack : Stack<number> = new Stack();
256e41f4b71Sopenharmony_cistack.push(2);
257e41f4b71Sopenharmony_cistack.push(4);
258e41f4b71Sopenharmony_cistack.push(5);
259e41f4b71Sopenharmony_cistack.push(4);
260e41f4b71Sopenharmony_cistack.forEach((value : number, index ?: number) :void => {
261e41f4b71Sopenharmony_ci  console.log("value:" + value, "index:" + index);
262e41f4b71Sopenharmony_ci});
263e41f4b71Sopenharmony_ci```
264e41f4b71Sopenharmony_ci
265e41f4b71Sopenharmony_ci### isEmpty
266e41f4b71Sopenharmony_ci
267e41f4b71Sopenharmony_ciisEmpty(): boolean
268e41f4b71Sopenharmony_ci
269e41f4b71Sopenharmony_ciChecks whether this container is empty (contains no elements).
270e41f4b71Sopenharmony_ci
271e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
272e41f4b71Sopenharmony_ci
273e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
274e41f4b71Sopenharmony_ci
275e41f4b71Sopenharmony_ci**Return value**
276e41f4b71Sopenharmony_ci
277e41f4b71Sopenharmony_ci| Type| Description|
278e41f4b71Sopenharmony_ci| -------- | -------- |
279e41f4b71Sopenharmony_ci| boolean | Returns **true** if the container is empty; returns **false** otherwise.|
280e41f4b71Sopenharmony_ci
281e41f4b71Sopenharmony_ci**Error codes**
282e41f4b71Sopenharmony_ci
283e41f4b71Sopenharmony_ciFor details about the error codes, see [Utils Error Codes](errorcode-utils.md).
284e41f4b71Sopenharmony_ci
285e41f4b71Sopenharmony_ci| ID| Error Message|
286e41f4b71Sopenharmony_ci| -------- | -------- |
287e41f4b71Sopenharmony_ci| 10200011 | The isEmpty method cannot be bound. |
288e41f4b71Sopenharmony_ci
289e41f4b71Sopenharmony_ci**Example**
290e41f4b71Sopenharmony_ci
291e41f4b71Sopenharmony_ci```ts
292e41f4b71Sopenharmony_cilet stack : Stack<number> = new Stack();
293e41f4b71Sopenharmony_cistack.push(2);
294e41f4b71Sopenharmony_cistack.push(4);
295e41f4b71Sopenharmony_cistack.push(5);
296e41f4b71Sopenharmony_cistack.push(4);
297e41f4b71Sopenharmony_cilet result = stack.isEmpty();
298e41f4b71Sopenharmony_ci```
299e41f4b71Sopenharmony_ci
300e41f4b71Sopenharmony_ci### [Symbol.iterator]
301e41f4b71Sopenharmony_ci
302e41f4b71Sopenharmony_ci[Symbol.iterator]\(): IterableIterator&lt;T&gt;
303e41f4b71Sopenharmony_ci
304e41f4b71Sopenharmony_ciObtains an iterator, each item of which is a JavaScript object.
305e41f4b71Sopenharmony_ci
306e41f4b71Sopenharmony_ci> **NOTE**
307e41f4b71Sopenharmony_ci>
308e41f4b71Sopenharmony_ci> This API cannot be used in .ets files.
309e41f4b71Sopenharmony_ci
310e41f4b71Sopenharmony_ci**Atomic service API**: This API can be used in atomic services since API version 12.
311e41f4b71Sopenharmony_ci
312e41f4b71Sopenharmony_ci**System capability**: SystemCapability.Utils.Lang
313e41f4b71Sopenharmony_ci
314e41f4b71Sopenharmony_ci**Return value**
315e41f4b71Sopenharmony_ci
316e41f4b71Sopenharmony_ci| Type| Description|
317e41f4b71Sopenharmony_ci| -------- | -------- |
318e41f4b71Sopenharmony_ci| IterableIterator&lt;T&gt; | Iterator obtained.|
319e41f4b71Sopenharmony_ci
320e41f4b71Sopenharmony_ci**Error codes**
321e41f4b71Sopenharmony_ci
322e41f4b71Sopenharmony_ciFor details about the error codes, see [Utils Error Codes](errorcode-utils.md).
323e41f4b71Sopenharmony_ci
324e41f4b71Sopenharmony_ci| ID| Error Message|
325e41f4b71Sopenharmony_ci| -------- | -------- |
326e41f4b71Sopenharmony_ci| 10200011 | The Symbol.iterator method cannot be bound. |
327e41f4b71Sopenharmony_ci
328e41f4b71Sopenharmony_ci**Example**
329e41f4b71Sopenharmony_ci```ts
330e41f4b71Sopenharmony_cilet stack : Stack<number> = new Stack();
331e41f4b71Sopenharmony_cistack.push(2);
332e41f4b71Sopenharmony_cistack.push(4);
333e41f4b71Sopenharmony_cistack.push(5);
334e41f4b71Sopenharmony_cistack.push(4);
335e41f4b71Sopenharmony_ci
336e41f4b71Sopenharmony_ci// Method 1:
337e41f4b71Sopenharmony_ciwhile(!stack.isEmpty()) {
338e41f4b71Sopenharmony_ci  // Service logic
339e41f4b71Sopenharmony_ci  let item = stack.pop()
340e41f4b71Sopenharmony_ci  console.log("value:" + item);
341e41f4b71Sopenharmony_ci}
342e41f4b71Sopenharmony_ci
343e41f4b71Sopenharmony_ci// Method 2:
344e41f4b71Sopenharmony_cilet iter = stack[Symbol.iterator]();
345e41f4b71Sopenharmony_cilet temp: IteratorResult<number> = iter.next().value;
346e41f4b71Sopenharmony_ciwhile(temp != undefined) {
347e41f4b71Sopenharmony_ci  console.log("value:" + temp);
348e41f4b71Sopenharmony_ci  temp = iter.next().value;
349e41f4b71Sopenharmony_ci}
350e41f4b71Sopenharmony_ci```
351