## 第四章 栈
4.1栈的实际需求
输入一个表达式,计算[75-23+9+6-3-3],点击计算。对于计算机而言,他收到的就是一个字符串,那么在计算机底层是如何得到运算结果的。
4.2栈的基本介绍
- 栈的英文名为(stack)。
- 栈是一个先入后出的有序列表。
- 栈是线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表,允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端,称为栈底。
- 根据栈的定义,最先放入的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除。
4.3栈的应用场景
- 子程序的调用,在跳往子程序前,会先将下个指令的地址存放到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
- 处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
- 表达式的转换,[中缀表达式转后缀表达式]与求值。
- 二叉树的遍历。
- 图形的深度优先搜索法。
4.4代码实现
思路:利用数组模拟栈
1)定义数组和栈的参数,包括top指针,数组最大值。
2)入栈操作,首先判断栈是否满,判断栈满的条件为top == maxSize-1;不可将其写为top == maxSize,会出现数组下标越界问题。判断完毕后令top++,插入数据。
3)出栈操作,首先判断栈是否为空,如果为空,抛出异常,判断栈空的条件为top==-1;随后top–,取出数据。
4)遍历栈,首先判断栈是否为空,然后从栈顶开始遍历,遵循先入后出原则。
package com.atguigu.stack;
import java.util.Scanner;
import javax.management.RuntimeErrorException;
public class ArrayStackDemo {
public static void main(String[] args) {
//创建栈
ArrayStack stack = new ArrayStack(4);
String key = "";
boolean loop = true;
//创建一个监视器
Scanner scanner = new Scanner(System.in);
while(loop) {
System.out.println("show:显示栈中数据");
System.out.println("exit:退出程序");
System.out.println("pop:取出栈中数据");
System.out.println("push:存入栈中数据");
System.out.println("请输入你的选择:");
key = scanner.next();
switch (key) {
case "show":
System.out.println("栈中数据为:");
stack.showList();
break;
case "push":
System.out.println("请输入一个整数:");
int value =scanner.nextInt();
stack.Push(value);
break;
case "pop":
try {
int res = stack.Pop();
System.out.printf("取出的数据为:%d\n",res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出--");
}
}
class ArrayStack{
private int maxSize;//定义栈的最大值
private int[] stack;//数组模拟栈,数据存放到数该数组中
private int top = -1;//定义栈顶指针,初始值设为-1
//建立构造器
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
//判断栈满
public boolean isFull(){
return top == maxSize-1;
}
//判断栈空
public boolean isEmpty() {
return top == -1;
}
//入栈
public void Push(int value) {
//判断栈是否满
if(isFull()) {
System.out.println("栈满,无法添加数据\n");
return;
}
else {
top++;
stack[top]=value;
System.out.println("数据添加成功\n");
}
}
//出栈
public int Pop() {
//判断栈是否空
if(isEmpty()) {
throw new RuntimeException("栈为空,没有数据");
}
int value = stack[top];
top--;
return value;
}
//显示栈中数据,遍历栈
public void showList() {
//判断栈是否为空
if(isEmpty()) {
System.out.println("栈为空,没有数据");
return ;
}
for(int i = top;i>=0;i--) {
System.out