栈的理解
栈的操作特性只允许在栈顶插入和删除数据。特征就是先进后出。
基于数组实现的顺序栈
public class ArrayStack{
private String[] items; //数组
private int count; //栈中的元素个数
private int n; //栈的大小
public ArrayStack(int n){
this.items=new String[n];
this.count=0;
this.n=n;
}
public boolean push(String item){
if (count==n) //空间不够入栈失败
return false;
item[count]=item; //将item放到下标为count的位置 并且count+1
++count;
return true;
}
public boolean pop(){
if (count=0)
return null;
String tmp=item[count-1];
--count;
return true;
}
}
栈在函数调用的应用
操作系统给每个线程分配一块独立的内存空间,被组织成’栈’用来存储函数调用时的临时变量
在调用过程中,每调用一个新的函数,编译器就会将被调用函数的临时变量封装为栈帧并压入栈,当被调用函数执行完毕并返回后,
编译器就会将这个函数对应的栈帧弹出栈。
栈在表达式求值的应用
对于简单的表达式 包括加减乘除的四则运算人脑可以简单的算出,但是计算机理解起来就不这么简单。
通常编译器是通过两个栈来实现表达式的求值,一个栈用来保存操作数,一个用来保存运算符。
在运算过程中 从左到右遍历表达式,遇到数字就压入操作数栈,遇到运算符
我们就会把遇到的运算符和运算符栈栈顶的运算法优先级进行比较,当前遇到的运算符优先级高的话,我们就把运算符压入栈
否则 我们就我们从运算符栈取出运算法 从操作数栈取出两个操作数,进行计算,并把结果压入操作数栈里面,然后继续比较这个运算符和栈顶运算符的优先级。
实现浏览器的前进和后退
创建两个栈 X,Y 首先把浏览的页面依次压入栈内
单击后退的时候 把x栈顶的数据取出压入y中,再次单击前进的时候 把y栈顶的数据取出来压入x中
当 x栈中没有数据的时候表示没有数据通过点击后退按钮进行浏览了,当y栈没有数据的时候表示没有数据通过单击前进进行浏览了