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<T>) => 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<T> | 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<T> 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<T> | 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