- 栈是一个先入后出的有序列表;
- 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一段,称为栈顶,另一端为固定的一端,称为栈底。
- 根据站的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
出栈(pop)和入栈(push)
应用场景:
- 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
- 表达式的转换与求值(中缀表达式转后缀表达式)
- 二叉树的遍历
- 图形的深度优先(dfs)
数组模拟
//实现栈的思路分析
class ArrStack{
private int maxSize;//栈的大小
private int[] stack;数组模拟栈;
private int top = -1;//表示栈顶,初始化为-1;
public ArrStack(int maxSize){
this.maxSize = maxSize;
stack = new int [this.maxSize];
}
//判断栈顶 是否满
public boolean isFull(){
return top == maxSize -1;
}
//判断栈空
public boolean isEmpty(){
return top == -1;
}
//入栈方法push
public void push(int value){
if(isFull()){//先判断是否栈满
System.out.println("栈满");
return;
}
top++;
stack[top] = value;
}
//出栈方法
public void pop(int value){
if(isEmpty()){//先判断是否栈空
throw new RuntimeExeption("栈空,没有数据");//抛出异常
return;
}
int value = stack[top];
top--;
return value;
}
//栈的遍历
public void list(){
if(isEmpty){
System.out.println("栈空,没有数据");
}
for(int i = top;i>=0;i--){
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
}