js-apis-stack.md 8.7 KB
Newer Older
L
linhaoran 已提交
1 2 3 4 5
# 线性容器Stack

> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
> 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

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

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

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

L
lengchangjing 已提交
12 13 14
文档中存在泛型的使用,涉及以下泛型标记符:<br>
- T: Type, 类

L
linhaoran 已提交
15 16
## 导入模块

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




## Stack

### 属性

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

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


### constructor

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

Stack的构造函数。

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

L
liu-ganlin 已提交
43 44 45 46
**错误码:**

以下错误码的详细介绍请参见[containers错误码](../errorcodes/errorcode-containers.md)

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

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

53
```ts
Z
zengyawen 已提交
54
let stack = new Stack();
L
liu-ganlin 已提交
55 56 57 58 59
try {
  let stack2 = Stack();
} catch(err) {
  console.log(`${err.code} - ${err.name} - ${err.message}`);
}
Z
zengyawen 已提交
60
```
L
linhaoran 已提交
61 62 63 64


### push

Z
zengyawen 已提交
65
push(item: T): T
L
linhaoran 已提交
66

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

Z
zengyawen 已提交
69 70
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
71
**参数:**
L
linhaoran 已提交
72

Z
zengyawen 已提交
73 74 75
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| item | T | 是 | 添加进去的元素。 |
L
linhaoran 已提交
76

Z
zengyawen 已提交
77 78 79 80 81 82
**返回值:**

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

L
liu-ganlin 已提交
83 84 85 86
**错误码:**

以下错误码的详细介绍请参见[containers错误码](../errorcodes/errorcode-containers.md)

L
liu-ganlin 已提交
87
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
88 89 90
| -------- | -------- |
| 10200011 | The push method cannot be bound. |

Z
zengyawen 已提交
91 92
**示例:**

93
```ts
Z
zengyawen 已提交
94
let stack = new Stack();
95 96
let result = stack.push("a");
let result1 = stack.push(1);
Z
zengyawen 已提交
97
let b = [1, 2, 3];
L
liu-ganlin 已提交
98
let result2 = stack.push(b);
L
lengchangjing 已提交
99
let c = {name : "Dylon", age : "13"};
100
let result3 = stack.push(c);
L
liu-ganlin 已提交
101
try {
L
liu-ganlin 已提交
102
  stack.push.bind({}, "b")(); // bind为JS标准内置对象Function的方法,用于改变this的指向,测试异常捕获
L
liu-ganlin 已提交
103 104 105
} catch(err) {
  console.log(`${err.code} - ${err.name} - ${err.message}`);
}
Z
zengyawen 已提交
106
```
L
linhaoran 已提交
107 108 109

### pop

Z
zengyawen 已提交
110
pop(): T
L
linhaoran 已提交
111 112 113

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

Z
zengyawen 已提交
114 115
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
116 117 118 119 120 121
**返回值:**

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

L
liu-ganlin 已提交
122 123 124 125
**错误码:**

以下错误码的详细介绍请参见[containers错误码](../errorcodes/errorcode-containers.md)

L
liu-ganlin 已提交
126
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
127 128 129
| -------- | -------- |
| 10200011 | The pop method cannot be bound. |

Z
zengyawen 已提交
130 131
**示例:**

132
```ts
Z
zengyawen 已提交
133 134 135 136 137 138
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
stack.push(4);
139
let result = stack.pop();
L
liu-ganlin 已提交
140
try {
L
liu-ganlin 已提交
141
  stack.pop.bind({})(); // bind为JS标准内置对象Function的方法,用于改变this的指向,测试异常捕获
L
liu-ganlin 已提交
142 143 144
} catch(err) {
  console.log(`${err.code} - ${err.name} - ${err.message}`);
}
Z
zengyawen 已提交
145
```
L
linhaoran 已提交
146 147 148

### peek

Z
zengyawen 已提交
149
peek(): T
L
linhaoran 已提交
150 151 152

获取并返回栈顶元素。

Z
zengyawen 已提交
153 154
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
155 156 157 158 159 160
**返回值:**

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

L
liu-ganlin 已提交
161 162 163 164
**错误码:**

以下错误码的详细介绍请参见[containers错误码](../errorcodes/errorcode-containers.md)

L
liu-ganlin 已提交
165
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
166 167 168
| -------- | -------- |
| 10200011 | The peek method cannot be bound. |

Z
zengyawen 已提交
169 170
**示例:**

171
```ts
Z
zengyawen 已提交
172 173 174 175 176
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
177
let result = stack.peek();
L
liu-ganlin 已提交
178
try {
L
liu-ganlin 已提交
179
  stack.peek.bind({})(); // bind为JS标准内置对象Function的方法,用于改变this的指向,测试异常捕获
L
liu-ganlin 已提交
180 181 182
} catch(err) {
  console.log(`${err.code} - ${err.name} - ${err.message}`);
}
Z
zengyawen 已提交
183 184
```

L
linhaoran 已提交
185 186
### locate

Z
zengyawen 已提交
187
locate(element: T): number
L
linhaoran 已提交
188 189 190

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

Z
zengyawen 已提交
191 192
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
193 194 195 196 197 198 199 200 201 202 203 204
**参数:**

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

**返回值:**

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

L
liu-ganlin 已提交
205 206 207 208
**错误码:**

以下错误码的详细介绍请参见[containers错误码](../errorcodes/errorcode-containers.md)

L
liu-ganlin 已提交
209
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
210 211 212
| -------- | -------- |
| 10200011 | The locate method cannot be bound. |

Z
zengyawen 已提交
213 214
**示例:**

215
```ts
Z
zengyawen 已提交
216 217 218 219 220
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
221
let result = stack.locate(2);
L
liu-ganlin 已提交
222
try {
L
liu-ganlin 已提交
223
  stack.locate.bind({}, 2)(); // bind为JS标准内置对象Function的方法,用于改变this的指向,测试异常捕获
L
liu-ganlin 已提交
224 225 226
} catch(err) {
  console.log(`${err.code} - ${err.name} - ${err.message}`);
}
Z
zengyawen 已提交
227
```
L
linhaoran 已提交
228 229

### forEach
230

L
linhaoran 已提交
231
forEach(callbackfn: (value: T, index?: number, stack?: Stack&lt;T&gt;) => void,
Z
zengyawen 已提交
232
thisArg?: Object): void
L
linhaoran 已提交
233 234 235

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

Z
zengyawen 已提交
236 237
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
**参数:**

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| callbackfn | function | 是 | 回调函数。 |
| thisArg | Object | 否 | callbackfn被调用时用作this值。 |

callbackfn的参数说明:

| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | -------- | -------- |
| value | T | 是 | 当前遍历到的元素。 |
| index | number | 否 | 当前遍历到的下标值。 |
| stack | Stack&lt;T&gt; | 否 | 当前调用forEach方法的实例对象。 |

L
liu-ganlin 已提交
253 254 255 256
**错误码:**

以下错误码的详细介绍请参见[containers错误码](../errorcodes/errorcode-containers.md)

L
liu-ganlin 已提交
257
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
258 259 260
| -------- | -------- |
| 10200011 | The forEach method cannot be bound. |

Z
zengyawen 已提交
261 262
**示例:**

263
```ts
Z
zengyawen 已提交
264 265 266 267 268 269
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);
stack.forEach((value, index) => {
270
 console.log("value:" + value, index);
Z
zengyawen 已提交
271
});
L
liu-ganlin 已提交
272 273 274
try {
  stack.forEach.bind({}, (value, index) => {
    console.log("value:" + value, index);
L
liu-ganlin 已提交
275
  })(); // bind为JS标准内置对象Function的方法,用于改变this的指向,测试异常捕获
L
liu-ganlin 已提交
276 277 278
} catch(err) {
  console.log(`${err.code} - ${err.name} - ${err.message}`);
}
Z
zengyawen 已提交
279 280
```

L
linhaoran 已提交
281
### isEmpty
282

Z
zengyawen 已提交
283
isEmpty(): boolean
L
linhaoran 已提交
284 285 286

判断该栈是否为空。

Z
zengyawen 已提交
287 288
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
289 290 291 292 293 294
**返回值:**

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

L
liu-ganlin 已提交
295 296 297 298
**错误码:**

以下错误码的详细介绍请参见[containers错误码](../errorcodes/errorcode-containers.md)

L
liu-ganlin 已提交
299
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
300 301 302
| -------- | -------- |
| 10200011 | The isEmpty method cannot be bound. |

Z
zengyawen 已提交
303 304
**示例:**

305
```ts
Z
zengyawen 已提交
306 307 308 309 310
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);
311
let result = stack.isEmpty();
L
liu-ganlin 已提交
312
try {
L
liu-ganlin 已提交
313
  stack.isEmpty.bind({})(); // bind为JS标准内置对象Function的方法,用于改变this的指向,测试异常捕获
L
liu-ganlin 已提交
314 315 316
} catch(err) {
  console.log(`${err.code} - ${err.name} - ${err.message}`);
}
Z
zengyawen 已提交
317
```
L
linhaoran 已提交
318 319 320

### [Symbol.iterator]

Z
zengyawen 已提交
321
[Symbol.iterator]\(): IterableIterator&lt;T&gt;
L
linhaoran 已提交
322 323 324

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

Z
zengyawen 已提交
325 326
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
327
**返回值:**
L
linhaoran 已提交
328

Z
zengyawen 已提交
329 330 331 332
| 类型 | 说明 |
| -------- | -------- |
| IterableIterator&lt;T&gt; | 返回一个迭代器。 |

L
liu-ganlin 已提交
333 334 335 336
**错误码:**

以下错误码的详细介绍请参见[containers错误码](../errorcodes/errorcode-containers.md)

L
liu-ganlin 已提交
337
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
338 339 340
| -------- | -------- |
| 10200011 | The Symbol.iterator method cannot be bound. |

Z
zengyawen 已提交
341
**示例:**
342
```ts
Z
zengyawen 已提交
343 344 345 346 347 348 349 350
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);

// 使用方法一:
for (let item of stack) { 
351
  console.log("value:" + item); 
Z
zengyawen 已提交
352 353 354 355 356 357
}

// 使用方法二:
let iter = stack[Symbol.iterator]();
let temp = iter.next().value;
while(temp != undefined) {
358
  console.log("value:" + temp);
Z
zengyawen 已提交
359 360
  temp = iter.next().value;
}
L
liu-ganlin 已提交
361
try {
L
liu-ganlin 已提交
362
  stack[Symbol.iterator].bind({})(); // bind为JS标准内置对象Function的方法,用于改变this的指向,测试异常捕获
L
liu-ganlin 已提交
363 364 365
} catch(err) {
  console.log(`${err.code} - ${err.name} - ${err.message}`);
}
Z
zengyawen 已提交
366
```