js-apis-stack.md 7.4 KB
Newer Older
1
# @ohos.util.Stack (线性容器Stack)
L
linhaoran 已提交
2

3 4 5 6
Stack基于数组的数据结构实现,特点是先进后出,只能在一端进行数据的插入和删除。

Stack和[Queue](js-apis-queue.md)相比,Queue基于循环队列实现,只能在一端删除,另一端插入,而Stack都在一端操作。

Z
zengyawen 已提交
7
**推荐使用场景:** 一般符合先进后出的场景可以使用Stack。
L
linhaoran 已提交
8

B
bi-hu 已提交
9 10 11 12 13 14 15
文档中存在泛型的使用,涉及以下泛型标记符:<br>
- T:Type,类

> **说明:**
>
> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

L
lengchangjing 已提交
16

L
linhaoran 已提交
17 18
## 导入模块

19
```ts
20
import Stack from '@ohos.util.Stack';  
L
linhaoran 已提交
21 22 23 24 25 26
```

## Stack

### 属性

Z
zengyawen 已提交
27 28
**系统能力:** SystemCapability.Utils.Lang

L
liu-ganlin 已提交
29
| 名称 | 类型 | 可读 | 可写 | 说明 |
L
linhaoran 已提交
30
| -------- | -------- | -------- | -------- | -------- |
Z
zengyawen 已提交
31
| length | number | 是 | 否 | Stack的元素个数。 |
L
linhaoran 已提交
32 33 34 35


### constructor

Z
zengyawen 已提交
36
constructor()
L
linhaoran 已提交
37 38 39

Stack的构造函数。

Z
zengyawen 已提交
40 41
**系统能力:** SystemCapability.Utils.Lang

L
liu-ganlin 已提交
42 43
**错误码:**

B
bi-hu 已提交
44
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
45

L
liu-ganlin 已提交
46
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
47 48 49
| -------- | -------- |
| 10200012 | The Stack's constructor cannot be directly invoked. |

Z
zengyawen 已提交
50
**示例:**
L
linhaoran 已提交
51

52
```ts
53
let stack : Stack<number | string | Object> = new Stack();
Z
zengyawen 已提交
54
```
L
linhaoran 已提交
55 56 57 58


### push

Z
zengyawen 已提交
59
push(item: T): T
L
linhaoran 已提交
60

Z
zengyawen 已提交
61
在栈顶插入元素,并返回该元素。
L
linhaoran 已提交
62

Z
zengyawen 已提交
63 64
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
65
**参数:**
L
linhaoran 已提交
66

Z
zengyawen 已提交
67 68 69
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| item | T | 是 | 添加进去的元素。 |
L
linhaoran 已提交
70

Z
zengyawen 已提交
71 72 73 74 75 76
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| T | 返回被添加进去的元素。 |

L
liu-ganlin 已提交
77 78
**错误码:**

B
bi-hu 已提交
79
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
80

L
liu-ganlin 已提交
81
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
82 83 84
| -------- | -------- |
| 10200011 | The push method cannot be bound. |

Z
zengyawen 已提交
85 86
**示例:**

87 88 89 90 91 92
```
class C1 {
  name: string = ""
  age: string = ""
}
let stack : Stack<number | string | C1> = new Stack();
93 94
let result = stack.push("a");
let result1 = stack.push(1);
Z
zengyawen 已提交
95
let b = [1, 2, 3];
L
liu-ganlin 已提交
96
let result2 = stack.push(b);
97
let c : C1  = {name : "Dylon", age : "13"};
98
let result3 = stack.push(c);
Z
zengyawen 已提交
99
```
L
linhaoran 已提交
100 101 102

### pop

Z
zengyawen 已提交
103
pop(): T
L
linhaoran 已提交
104 105 106

删除栈顶元素并返回该删除元素。

Z
zengyawen 已提交
107 108
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
109 110 111 112 113 114
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| T | 返回删除的元素。 |

L
liu-ganlin 已提交
115 116
**错误码:**

B
bi-hu 已提交
117
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
118

L
liu-ganlin 已提交
119
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
120 121 122
| -------- | -------- |
| 10200011 | The pop method cannot be bound. |

Z
zengyawen 已提交
123 124
**示例:**

125
```ts
126
let stack : Stack<number> = new Stack();
Z
zengyawen 已提交
127 128 129 130 131
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
stack.push(4);
132
let result = stack.pop();
Z
zengyawen 已提交
133
```
L
linhaoran 已提交
134 135 136

### peek

Z
zengyawen 已提交
137
peek(): T
L
linhaoran 已提交
138 139 140

获取并返回栈顶元素。

Z
zengyawen 已提交
141 142
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
143 144 145 146 147 148
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| T | 返回栈顶元素。 |

L
liu-ganlin 已提交
149 150
**错误码:**

B
bi-hu 已提交
151
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
152

L
liu-ganlin 已提交
153
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
154 155 156
| -------- | -------- |
| 10200011 | The peek method cannot be bound. |

Z
zengyawen 已提交
157 158
**示例:**

159
```ts
160
let stack : Stack<number> = new Stack();
Z
zengyawen 已提交
161 162 163 164
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
165
let result = stack.peek();
Z
zengyawen 已提交
166 167
```

L
linhaoran 已提交
168 169
### locate

Z
zengyawen 已提交
170
locate(element: T): number
L
linhaoran 已提交
171 172 173

返回指定元素第一次出现时的下标值,查找失败返回-1。

Z
zengyawen 已提交
174 175
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
176 177 178 179 180 181 182 183 184 185 186 187
**参数:**

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| element | T | 是 | 指定元素。 |

**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| number | 找到就返回下标值,查找失败返回-1。 |

L
liu-ganlin 已提交
188 189
**错误码:**

B
bi-hu 已提交
190
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
191

L
liu-ganlin 已提交
192
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
193 194 195
| -------- | -------- |
| 10200011 | The locate method cannot be bound. |

Z
zengyawen 已提交
196 197
**示例:**

198
```ts
199
let stack : Stack<number> = new Stack();
Z
zengyawen 已提交
200 201 202 203
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
204
let result = stack.locate(2);
Z
zengyawen 已提交
205
```
L
linhaoran 已提交
206 207

### forEach
208

209
forEach(callbackFn: (value: T, index?: number, stack?: Stack&lt;T&gt;) => void,
Z
zengyawen 已提交
210
thisArg?: Object): void
L
linhaoran 已提交
211 212 213

通过回调函数来遍历Stack实例对象上的元素以及元素对应的下标。

Z
zengyawen 已提交
214 215
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
216 217 218 219
**参数:**

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
220
| callbackFn | function | 是 | 回调函数。 |
221
| thisArg | Object | 否 | callbackfn被调用时用作this值,默认值为当前实例对象。 |
Z
zengyawen 已提交
222 223 224 225 226 227

callbackfn的参数说明:

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| value | T | 是 | 当前遍历到的元素。 |
228 229
| index | number | 否 | 当前遍历到的下标值,默认值为0。 |
| stack | Stack&lt;T&gt; | 否 | 当前调用forEach方法的实例对象,默认值为当前实例对象。 |
Z
zengyawen 已提交
230

L
liu-ganlin 已提交
231 232
**错误码:**

B
bi-hu 已提交
233
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
234

L
liu-ganlin 已提交
235
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
236 237 238
| -------- | -------- |
| 10200011 | The forEach method cannot be bound. |

Z
zengyawen 已提交
239 240
**示例:**

241
```ts
242
let stack : Stack<number> = new Stack();
Z
zengyawen 已提交
243 244 245 246
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);
247
stack.forEach((value : number, index ?: number) :void => {
248
  console.log("value:" + value, "index:" + index);
Z
zengyawen 已提交
249 250 251
});
```

L
linhaoran 已提交
252
### isEmpty
253

Z
zengyawen 已提交
254
isEmpty(): boolean
L
linhaoran 已提交
255 256 257

判断该栈是否为空。

Z
zengyawen 已提交
258 259
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
260 261 262 263 264 265
**返回值:**

| 类型 | 说明 |
| -------- | -------- |
| boolean | 为空返回true,不为空返回false。 |

L
liu-ganlin 已提交
266 267
**错误码:**

B
bi-hu 已提交
268
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
269

L
liu-ganlin 已提交
270
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
271 272 273
| -------- | -------- |
| 10200011 | The isEmpty method cannot be bound. |

Z
zengyawen 已提交
274 275
**示例:**

276
```ts
277
let stack : Stack<number> = new Stack();
Z
zengyawen 已提交
278 279 280 281
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);
282
let result = stack.isEmpty();
Z
zengyawen 已提交
283
```
L
linhaoran 已提交
284 285 286

### [Symbol.iterator]

Z
zengyawen 已提交
287
[Symbol.iterator]\(): IterableIterator&lt;T&gt;
L
linhaoran 已提交
288 289 290

返回一个迭代器,迭代器的每一项都是一个 JavaScript 对象,并返回该对象。

Z
zengyawen 已提交
291 292
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
293
**返回值:**
L
linhaoran 已提交
294

Z
zengyawen 已提交
295 296 297 298
| 类型 | 说明 |
| -------- | -------- |
| IterableIterator&lt;T&gt; | 返回一个迭代器。 |

L
liu-ganlin 已提交
299 300
**错误码:**

B
bi-hu 已提交
301
以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)
L
liu-ganlin 已提交
302

L
liu-ganlin 已提交
303
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
304 305 306
| -------- | -------- |
| 10200011 | The Symbol.iterator method cannot be bound. |

Z
zengyawen 已提交
307
**示例:**
308
```ts
309
let stack : Stack<number> = new Stack();
Z
zengyawen 已提交
310 311 312 313 314 315
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);

// 使用方法一:
316 317 318 319
while(!stack.isEmpty()) {
  // 业务逻辑
  let item = stack.pop()
  console.log("value:" + item);
Z
zengyawen 已提交
320 321 322 323
}

// 使用方法二:
let iter = stack[Symbol.iterator]();
324
let temp: IteratorResult<number> = iter.next().value;
Z
zengyawen 已提交
325
while(temp != undefined) {
326
  console.log("value:" + temp);
Z
zengyawen 已提交
327 328 329
  temp = iter.next().value;
}
```