js-apis-stack.md 7.0 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
```

## Stack

### 属性

Z
zengyawen 已提交
25 26
**系统能力:** SystemCapability.Utils.Lang

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


### constructor

Z
zengyawen 已提交
34
constructor()
L
linhaoran 已提交
35 36 37

Stack的构造函数。

Z
zengyawen 已提交
38 39
**系统能力:** SystemCapability.Utils.Lang

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

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

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

Z
zengyawen 已提交
48
**示例:**
L
linhaoran 已提交
49

50
```ts
Z
zengyawen 已提交
51 52
let stack = new Stack();
```
L
linhaoran 已提交
53 54 55 56


### push

Z
zengyawen 已提交
57
push(item: T): T
L
linhaoran 已提交
58

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

Z
zengyawen 已提交
61 62
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
63
**参数:**
L
linhaoran 已提交
64

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

Z
zengyawen 已提交
69 70 71 72 73 74
**返回值:**

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

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

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

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

Z
zengyawen 已提交
83 84
**示例:**

85
```ts
Z
zengyawen 已提交
86
let stack = new Stack();
87 88
let result = stack.push("a");
let result1 = stack.push(1);
Z
zengyawen 已提交
89
let b = [1, 2, 3];
L
liu-ganlin 已提交
90
let result2 = stack.push(b);
L
lengchangjing 已提交
91
let c = {name : "Dylon", age : "13"};
92
let result3 = stack.push(c);
Z
zengyawen 已提交
93
```
L
linhaoran 已提交
94 95 96

### pop

Z
zengyawen 已提交
97
pop(): T
L
linhaoran 已提交
98 99 100

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

Z
zengyawen 已提交
101 102
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
103 104 105 106 107 108
**返回值:**

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

L
liu-ganlin 已提交
109 110 111 112
**错误码:**

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

L
liu-ganlin 已提交
113
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
114 115 116
| -------- | -------- |
| 10200011 | The pop method cannot be bound. |

Z
zengyawen 已提交
117 118
**示例:**

119
```ts
Z
zengyawen 已提交
120 121 122 123 124 125
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
stack.push(4);
126
let result = stack.pop();
Z
zengyawen 已提交
127
```
L
linhaoran 已提交
128 129 130

### peek

Z
zengyawen 已提交
131
peek(): T
L
linhaoran 已提交
132 133 134

获取并返回栈顶元素。

Z
zengyawen 已提交
135 136
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
137 138 139 140 141 142
**返回值:**

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

L
liu-ganlin 已提交
143 144 145 146
**错误码:**

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

L
liu-ganlin 已提交
147
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
148 149 150
| -------- | -------- |
| 10200011 | The peek method cannot be bound. |

Z
zengyawen 已提交
151 152
**示例:**

153
```ts
Z
zengyawen 已提交
154 155 156 157 158
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
159
let result = stack.peek();
Z
zengyawen 已提交
160 161
```

L
linhaoran 已提交
162 163
### locate

Z
zengyawen 已提交
164
locate(element: T): number
L
linhaoran 已提交
165 166 167

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

Z
zengyawen 已提交
168 169
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
170 171 172 173 174 175 176 177 178 179 180 181
**参数:**

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

**返回值:**

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

L
liu-ganlin 已提交
182 183 184 185
**错误码:**

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

L
liu-ganlin 已提交
186
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
187 188 189
| -------- | -------- |
| 10200011 | The locate method cannot be bound. |

Z
zengyawen 已提交
190 191
**示例:**

192
```ts
Z
zengyawen 已提交
193 194 195 196 197
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(2);
198
let result = stack.locate(2);
Z
zengyawen 已提交
199
```
L
linhaoran 已提交
200 201

### forEach
202

L
linhaoran 已提交
203
forEach(callbackfn: (value: T, index?: number, stack?: Stack&lt;T&gt;) => void,
Z
zengyawen 已提交
204
thisArg?: Object): void
L
linhaoran 已提交
205 206 207

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

Z
zengyawen 已提交
208 209
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
**参数:**

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

callbackfn的参数说明:

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

L
liu-ganlin 已提交
225 226 227 228
**错误码:**

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

L
liu-ganlin 已提交
229
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
230 231 232
| -------- | -------- |
| 10200011 | The forEach method cannot be bound. |

Z
zengyawen 已提交
233 234
**示例:**

235
```ts
Z
zengyawen 已提交
236 237 238 239 240 241
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);
stack.forEach((value, index) => {
242
 console.log("value:" + value, index);
Z
zengyawen 已提交
243 244 245
});
```

L
linhaoran 已提交
246
### isEmpty
247

Z
zengyawen 已提交
248
isEmpty(): boolean
L
linhaoran 已提交
249 250 251

判断该栈是否为空。

Z
zengyawen 已提交
252 253
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
254 255 256 257 258 259
**返回值:**

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

L
liu-ganlin 已提交
260 261 262 263
**错误码:**

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

L
liu-ganlin 已提交
264
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
265 266 267
| -------- | -------- |
| 10200011 | The isEmpty method cannot be bound. |

Z
zengyawen 已提交
268 269
**示例:**

270
```ts
Z
zengyawen 已提交
271 272 273 274 275
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);
276
let result = stack.isEmpty();
Z
zengyawen 已提交
277
```
L
linhaoran 已提交
278 279 280

### [Symbol.iterator]

Z
zengyawen 已提交
281
[Symbol.iterator]\(): IterableIterator&lt;T&gt;
L
linhaoran 已提交
282 283 284

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

Z
zengyawen 已提交
285 286
**系统能力:** SystemCapability.Utils.Lang

Z
zengyawen 已提交
287
**返回值:**
L
linhaoran 已提交
288

Z
zengyawen 已提交
289 290 291 292
| 类型 | 说明 |
| -------- | -------- |
| IterableIterator&lt;T&gt; | 返回一个迭代器。 |

L
liu-ganlin 已提交
293 294 295 296
**错误码:**

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

L
liu-ganlin 已提交
297
| 错误码ID | 错误信息 |
L
liu-ganlin 已提交
298 299 300
| -------- | -------- |
| 10200011 | The Symbol.iterator method cannot be bound. |

Z
zengyawen 已提交
301
**示例:**
302
```ts
Z
zengyawen 已提交
303 304 305 306 307 308 309 310
let stack = new Stack();
stack.push(2);
stack.push(4);
stack.push(5);
stack.push(4);

// 使用方法一:
for (let item of stack) { 
311
  console.log("value:" + item); 
Z
zengyawen 已提交
312 313 314 315 316 317
}

// 使用方法二:
let iter = stack[Symbol.iterator]();
let temp = iter.next().value;
while(temp != undefined) {
318
  console.log("value:" + temp);
Z
zengyawen 已提交
319 320 321
  temp = iter.next().value;
}
```