一、概念
1. 定义
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
特性: 先进后出,后进先出。
2. 栈的应用场景
- 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以
回到原来的程序中。 - 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆
栈中。 - 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
- 二叉树的遍历。
- 图形的深度优先(depth 一first)搜索法。
二、栈的实现
1. 思路
- 使用数组stack来模拟栈;
- 定义一个top变量来表示栈顶,初始化为 -1;
- 入栈:top++,stack[top] = data;
- 出栈:直接返回stack[top]即可。
2. 代码实现
/**
* @auther 半命i 2020/1/11
* @description 数组模拟栈
*/
class ArrayStack {
private int maxsize; //栈的大小
private int[] stack; //数组模拟栈
private int top = -1; //top表示栈顶,初始化为-1
public ArrayStack(int maxsize) {
this.maxsize = maxsize;
stack = new int[this.maxsize];
}
/**
* 判断栈是否满
* @return
*/
public boolean isFull() {
return top == maxsize - 1;
}
/**
* 判断栈是否为空
* @return
*/
public boolean isEmpty() {
return top == -1;
}
/**
* 入栈
* @param value
*/
public void push(int value) {
//先判断栈是否已满
if (isFull()) {
System.out.println("栈满!");
return;
}
top ++;
stack[top] = value;
}
/**
* 出栈
* @return
*/
public int pop() {
//先判断栈是否为空
if (isEmpty()) {
throw new RuntimeException("栈空,没有数据!");
}
int value = stack[top];
top --;
return value;
}
}