一、基本介绍:
- 栈是一个先入后出的有序列表
- 栈中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表,允许插入和删除的一端为变化的一段,称为栈顶。
- 最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
二、示意图:
三、栈的应用场景:
- 子程序的调用,在跳往子程序前,会先将下个指令的地址存在堆栈中,直到子程序执行完成后再将地址取出,以回到原来的程序中。
- 处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址处也将参数、区域、变量等数据存入堆栈中。
- 表达式的转换【中缀表达式转后缀表达式】与求值。
- 二叉树的遍历。
- 图形的深度优先(depth-first)搜索法。
四、数组模拟栈的思路分析:
- 定义一个top表示栈顶初始值为-1。
- 入栈操作,当有数据加入到栈时
top++ ; stack[top]=value;
- 出栈操作,当有数据出栈时
int value = stack[top] ;return value;
五、代码展示:
package stack;
import java.util.Scanner;
public class ArrayStack {
public static void main(String[] args) {
// 测试一下
// 先创建一个对象,表示一个栈
ArrayStackDemo stack = new ArrayStackDemo(4);
String key = "";
boolean loop = true;// 控制是否推出菜单
Scanner input = 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 = input.next();
switch (key) {
case "show":
stack.list();
break;
case "push":
System.out.println("请输入一个值");
int value = input.nextInt();
stack.push(value);
break;
case "pop":
try {
int res = stack.pop();
System.out.println("出栈的数据:"+res);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
break;
case "exit":
input.close();
loop=false;
break;
default:
break;
}
}
}
}
//定义一个arrayStack类,表示栈结构
class ArrayStackDemo {
private int maxSize;// 栈大小
private int[] stack;// 数组,数组模拟栈,数据就放在数组
private int top = -1;// 初始化数据
// 构造器
public ArrayStackDemo(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()) {
return;
} else {
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]);
}
}
}