js手动封装栈结构
一、什么是栈结构
(1)栈的概念:
在了解栈之前我们先了解一下数组,数组是一个线性结构,在数组的任意位置可以插入和删除元素,但是有些时候为了实现某些功能,必须对任意加以限制,栈就是一种受限的线性结构
(2)栈的特点:
1.栈只允许在表的一端进行添加和删除元素,这一端被称为栈顶,另一端被称为栈底2.向一个栈中添加新元素叫做进栈、入栈或者压栈,向一个栈中删除元素叫做出栈和退栈。
二、程序中的栈结构
(1)函数调用栈 a(b(c()))
a函数中调用b函数,b函数中调用c函数,执行过程中,把a压入栈中,然后把b压入栈,最后c入栈,进栈的顺序是a->b->c,当c中函数执行完之后,c出栈,随后b出栈,最后a出栈,出栈顺序是c->b->a
(2)递归
当没有停止条件递归会导致栈溢出,因为函数不断的调用自己,函数会不断的进栈,而且函数没有执行完,所有不会出栈,这样就会造成栈溢出
三、用js手动封装栈结构
(1)栈常见的操作:
push()
添加一个新元素到栈顶位置。pop()
移除栈顶的元素,同时返回被移除的元素。peek()
返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)。isEmpty()
如果栈里没有任何元素就返回true
,否则返回false
。size()
返回栈里的元素个数。这个方法和数组的length
属性类似。toString()
将栈结构的内容以字符串的形式返回。
- List item
(2) 栈结构的封装
class Stack {
constructor() {
this.items = [];
}
// push(item) 压栈操作,往栈里面添加元素
push(item) {
this.items.push(item);
}
// pop() 出栈操作,从栈中取出元素,并返回取出的那个元素
pop() {
return this.items.pop();
}
// peek() 查看栈顶元素
peek() {
return this.items[this.items.length - 1];
}
// isEmpty() 判断栈是否为空
isEmpty() {
return this.items.length === 0;
}
// size() 获取栈中元素个数
size() {
return this.items.length;
}
// toString() 返回以字符串形式的栈内元素数据
toString() {
let result = “”;
for (let item of this.items) {
result += item + " ";
}
return result;
}
}
### 测试封装的栈结构
```js
// push() 测试
stack.push(10);
stack.push(20);
stack.push(30);
console.log(stack.items); //--> [10, 20, 30]
// pop() 测试
console.log(stack.pop()); //--> 30
// peek() 测试
console.log(stack.peek()); //--> 20
// isEmpty() 测试
console.log(stack.isEmpty()); //--> false
// size() 测试
console.log(stack.size()); //--> 2
// toString() 测试
console.log(stack.toString()); //--> 10 20