栈(stack)的介绍
- 栈是一个先入后出的有序列表
- 栈(stack)是限制线性表中元素的插入和删除,只能在线性表的同一端进行的一种特殊线性表,允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
- 根据栈的定义可知,最先放入栈中元素的栈底,最后放入的元素在栈底,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
栈的应用场景
- 子程序的调用:在跳往子程序前,会先将下一个指令的地址存到堆栈中,子程序执行完后再将地址取出,以回到原来的程序中,return
- 处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址,也将参数、区域变量等数据存入堆栈中。
- 表达式的转换与求值
- 二叉树的遍历
- 图形的深度优先搜索法。
- 栈-实现逆波兰计算器
实现栈的思路分析
- 实现数组来模拟栈
- 定义一个top来表示栈底,初始化为-1
- 入栈的操作,当有数据加入到栈时,top++,stack[top]=data
- 出栈步骤参考第三步
代码实现
public class MyStack {
private int maxSize;
private int[] stack;
private int top;
public MyStack() {
}
public MyStack(int maxSize) {
this.maxSize = maxSize;
this.stack = new int[maxSize];
this.top = -1;
}
private boolean isFull(){
if(top==maxSize-1){
return true;
}else {
return false;
}
}
private boolean isEmpty(){
if(top==-1){
return true;
}else {
return false;
}
}
private void push(int data){
if(!isFull()){
stack[++top]=data;
}else{
System.out.println("栈已满");
}
}
private int pop(){
if(!isEmpty()){
return stack[top--];
}else{
throw new RuntimeException("栈为空");
}
}
private void showStack(){
for(int i=0;i<=top;i++){
System.out.println(stack[i]);
}
}
public static void main(String[] args) {
MyStack stack = new MyStack(5);
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
stack.push(6);
stack.showStack();
stack.pop();
stack.pop();
stack.pop();
stack.pop();
stack.pop();
stack.pop();
}
}
前缀表达式(波兰表达式)
- 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前
- 举例说明:(3+4)5-6对应的前缀表达式就是-+3456
中缀表达式
- 中缀表达式就是常见的运算表达式,如(3+4)*5-6
- 中缀表达式的求值是我们人最熟悉的,但是对计算机来说却不好操作,因此在计算结果时,往往会将中缀表达式转成其他表达式来操作(一般转成后缀表达式)
后缀表达式(逆波兰表达式)
- 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后
- 举例说明,
- (3+4)5-6对应的后缀表达式就是34+56-
- a+b对应的后缀表达式就是ab+