“栈” 是一种数据结构,遵循 "后进先出" 原则,可以想象为可比克桶装薯片,拿的时候只能拿最上层的薯片。
栈结构要满足以下的特性:
- 后进先出: 最后进入栈的元素首先被取出
- 有限大小: 有固定大小的容量 或者可以动态扩展容量,不可能无限增长
- 只能在栈顶做增删操作: 新增和删除都是在栈顶位置
- 高效操作:入栈push 和出栈pop 在O(1)时间完成,时间复杂度为常数
栈的主要功能有:
- 压栈(Push) :向栈顶插入一个元素。新元素成为栈顶元素。
- 出栈(Pop) :移除栈顶元素,并返回被移除的元素。
- 查看栈顶元素:返回栈顶元素,但不移除它。
- 检查栈是否为空:判断栈是否为空。如果栈中没有元素,则返回真(True),否则返回假(False)。
- 获取栈的大小:返回栈中元素的数量。
- 清空栈:移除栈中的所有元素,使其变为空栈。
- 其他操作:根据需要,还可以实现如反转栈、复制栈、搜索栈等操作。
栈在计算机科学中有广泛的应用,例如:
- 表达式求值:使用栈来处理逆波兰表达式。
- 后退功能:在浏览器中使用栈来存储历史记录。
- 函数调用:在编程语言中,使用栈来存储函数调用信息,如局部变量、返回地址等。
- 算法实现:如深度优先搜索(DFS)、逆序打印链表等。
- 程序调用的上下文切换:操作系统使用栈来保存和恢复程序执行的状态。
用js实现栈结构:
// 栈
class Stack {
constructor() {
this.stack = []
}
// 入栈
push(item) {
this.stack.push(item)
}
// 出栈
pop() {
if (this.isEmpty()) {
return undefined
} else {
return this.stack.pop()
}
}
// 查看栈顶
peek() {
if (this.isEmpty()) {
return undefined
} else {
return this.stack[this.stack.length - 1]
}
}
// 判断栈是否为空
isEmpty() {
return this.stack.length === 0
}
//清空栈
clear() {
this.stack = []
}
size() {
return this.stack.length
}
}
const myStack = new Stack()
myStack.push(1)
myStack.push(2)
myStack.push(3)
myStack.push(4)
console.log(myStack.size())//4
console.log(myStack.peek())//4
console.log(myStack.pop())//4
console.log(myStack.peek())//3
console.log(myStack.isEmpty())//false
console.log(myStack.size())//3
myStack.clear()
console.log(myStack.size())//0