数据结构-栈
一、介绍
1.1 栈是什么结构
像一摞叠放的盘子,放牌子的时候只能将盘子放在最上面,取盘子的时候只能先取最上面的盘子。**后进先出,先进后出,**这就是典型的栈结构。
1.2 栈带给我们的只有限制,有了数组和链表为啥还需要栈?
- 功能上来说,数组、链表完全可以替代栈,但是越灵活越自由,代表着更容易出错。
- 当某个数据集合只涉及在一端进行插入和删除,并且满足后进先出,先进后出时就应该首选栈作为数据结构。
二、栈的实现
- 数组和链表,是基础的数据结构,其他的数据结构也可以由它们来实现。
- 由数组实现的栈称为顺序栈
- 由链表实现的称为链式栈
2.1 顺序栈代码示例
//定义一个栈结构
public class ArrayStack{
//数组结构
private String[] items;
//栈元素个数
private int count;
//栈大小
private int n;
//构造方法
public ArrayStack(int n){
this.item=new String[n];
this.count=0;
this.n=n;
}
//入栈方法
public boolean push (){
if(count==n){
return false; //满了
}
item[count]=item;
count++;
return true;
}
//出栈方法
public String pop (){
if(count==0){
return null; //空的
}
String temp=item[count-1];
count--;
return temp;
}
}
2.2 入栈出栈复杂度
时间复杂度:入栈出栈,都只涉及栈顶元素,所以时间复杂度是O(1)
空间复杂度:只用到了一两个临时变量,所以空间复杂度是O(1)
三、栈的应用
3.1 栈在函数调用中的应用
在程序执行时,每次调用一个新的方法编译器会将函数的临时变量封装为栈帧入栈,执行结束返回后再出栈。
3.2 栈在表达式求值中的应用
对于一个包含不同优先级运算符的表达式来说,编译器就是通过两个栈来对其进行求值。
例如,计算3+5*8-6 其计算过程如下。
- 操作数3 入栈
- 运算符+ 入栈
- 操作数5 入栈
- 运算符* 入栈
- 操作数8 入栈
- 运算符 - 尝试入栈,发现优先级低于运算符栈顶元素 “*”
- 取出操作数两个元素和栈顶元素进行运算,运算结果进入操作数栈
- 运算符 - 再次尝试入栈 发现优先级等于栈顶元素 “+”
- 再出取出操作数两个元素和 “+” 进行运算结果入栈
- 至此操作符栈空, “-” 入栈
- 6 入栈,开始计算结果。
3.3 栈用于括号匹配检查
如果表达式存在三种括号,()、[]、{} 如何检查括号格式的正确性呢?
- 使用一个栈,来保存左括号,从左到右扫描表达式,遇到左括号则入栈
- 遇到右括号,则栈顶取出一个左括号与其匹配
- 如果中途匹配括号失败,或者扫描结束栈不为空,则说明表达式格式不正确。
3.4 浏览器利用栈实现前进后退
存在两个栈,一个保存前进的历史页面一个保存后退的历史页面
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具