5 栈(stack)
5.1 栈的概念
栈,stack。是一个先入后出的有序列表。
栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
入栈:先进入的元素,在栈底。
出栈:最先进入的元素,最后出栈。从栈顶开始出。
5.2 栈的应用场景
- 子程序的调用:在跳往子程序前,会先将下一个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
- 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
- 表达式的转换【中缀表达式转后缀表达式】与求值(实际解决)。
- 二叉树的遍历。
- 图形的深度优先(depth-first)搜索法。
5.3 数组模拟栈
--(1)如何去定义一个栈?
class ArrayStack{
private int maxSize; //栈的容量
private int[] stack; //数组模拟栈
private int top = -1; //栈顶
public ArrayStack(int maxSize){
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
//判断栈满
//判断栈空
//入栈
//出栈
//遍历栈
}
--(2)如何判断栈满?
public boolean isFull(){
return top == maxSize - 1; //如果栈容量=1,栈满时栈顶为-1+1=0
}
--(3)如何判断栈空?
public boolean isEmpty(){
return top == -1; //栈空的时候,栈顶就等于初始值-1
}
--(4)入栈
public void push(int value){
//判断是否满
if(isFull){
sout("栈满");
return;
}
top++;
stack[top] == value;
}
--(5)出栈
public int pop(){
//判断栈是否空
if(isEmpty){
throw new RuntimeExecption("栈空");
}
int value = stack[top];
top--;
return value;
}
--(6)遍历栈
public void list(){
//判断栈是否为空
if(empty){
sout("栈空");
return;
}
//从栈顶开始遍历
for(int i=top; i>=0; i--){
sout("stack[ + "i" + ] = " + stack[i]);
}
}
/**
* Author: codejiwei
* Date: 2021/5/14
* Desc:
**/
public class ArrayStackDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//测试一下ArrayStack是否正确
ArrayStack stack = new ArrayStack(4);
boolean loop = true;
while (loop){
System.out.println("show: 遍历显示栈");
System.out.println("exit: 退出程序");
System.out.println("push: 添加数据到栈(入栈)");
System.out.println("pop: 从栈中取出数据(出栈)");
System.out.println("请输入你的选择:");
String key = scanner.next();
switch (key){
case "show":
stack.list();
break;
case "exit":
loop = false;
break;
case "push":
System.out.println("请输入一个数:");
int value = scanner.nextInt();
stack.push(value);
break;
case "pop":
try {
int pop = stack.pop();
System.out.println("取出的数据是:" + pop);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
default:
break;
}
}
}
}
//定义一个ArrayStack 表示栈
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];
}
//栈满
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;
}
//出栈 pop
public int pop(){
//判断栈是否空
if (isEmpty()){
throw new RuntimeException("栈空,没有数据");
}
int value = stack[top];
top--;
return value;
}
//遍历栈,遍历时从栈顶开始显示数据
public void list(){
//判断栈是否为空
if (isEmpty()){
System.out.println("栈空,没有数据");
return;
}
//从栈顶开始显示数据
for (int i = top; i >= 0; i--) {
System.out.printf("stack[%d]=%d\n", i, stack[i]);
}
}
}