栈的一个实际需求
如题:
请输入一个表达式
表达式 7 * 2 * 2 - 5 + 1 - 5 + 3 - 3
试问:计算机底层是如何得到结果的?但是计算机是理解这个算式的,对于计算机来说,他收到的是一个字符串,因此就要想一个办法,把他的数组拆出来,然后还得运算符是什么,还要考虑运算符的优先级。要解决这个问题就需要用到栈。
栈(stack)是什么
- 栈是一个先入后出的有序列表(FILO First ln Last Out).
- 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。
- 允许插入和删除的一端,为变化的一端,称为栈顶(TOP),另外一端为固定的一端,称为栈底(Bottom)
- 最先入栈的元素在栈底,最后进入的元素在栈底,而删除元素正好相反,最后入栈的元素最先删除,最先入栈的元素最后删除。
元素入栈如下如所示
元素出栈如下图所示
栈的一下应用场景
- 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
- 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
- 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
- 二叉树的遍历。
- 图形的深度优先(depth 一 first)搜索法。
Java代码实现
数组模拟栈
因为栈是一种有序表,当然可以使用数组的结构来存储栈的数据内容,如下代码演示数组模拟栈的出栈和入栈操作。
package stack.arrayStack;
/**
* 数组模拟栈
*/
public class ArrayStackTest {
public static void main(String[] args) {
try {
ArrayStack arrayStack = new ArrayStack(5);
System.out.println("添加元素:");
arrayStack.push(5);
arrayStack.push(6);
arrayStack.push(3);
arrayStack.push(2);
arrayStack.push(7);
//遍历元素
System.out.println("输出栈元素:");
arrayStack.show();
//出栈
System.out.println("出栈元素:");
System.out.println("arrayStack.pop() = " + arrayStack.pop());
System.out.println("arrayStack.pop() = " + arrayStack.pop());
System.out.println("arrayStack.pop() = " + arrayStack.pop());
System.out.println("arrayStack.pop() = " + arrayStack.pop());
System.out.println("arrayStack.pop() = " + arrayStack.pop());
System.out.println("arrayStack.pop() = " + arrayStack.pop());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
class ArrayStack{
//栈的大小
private int maxSize;
//数组 存储元素
private int[] stack;
// 栈顶,初始化为-1
private int top;
private int bottom;
// 构造器 初始化栈
ArrayStack(int maxSize){
top = -1;
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
/**
* 栈满
* @return
*/
public boolean isFull(){
return top == maxSize -1;
}
/**
* 是否空栈
* @return
*/
public boolean isEmpty(){
return top == -1;
}
/**
* 入栈
* @param num
*/
public void push(int num){
if (isFull()){
throw new RuntimeException("栈满了。。");
}
System.out.println(num + "入栈了");
//元素入栈
top++;
stack[top] = num;
}
/**
* 出栈
* @return 栈顶元素
*/
public int pop(){
if (isEmpty()){
throw new RuntimeException("栈空了。。");
}
//取出数据
int num = stack[top];
//栈顶减1
top--;
return num;
}
/**
* 遍历栈
*/
public void show(){
if (isEmpty()){
throw new RuntimeException("栈空了。。");
}
for (int i = top; i > 0; i--) {
//格式化输出元素
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
}
输出结果