1.栈的应用场景
- 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
- 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
- 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
- 二叉树的遍历。
- 图形的深度优先(depth一first)搜索法。
2.数组模拟栈的思路分析
- 使用数组来模拟栈
- 定义一个top来表示栈顶,初始化为-1
- 入栈的操作,当有数据加入到栈时,
top++; stack[top]=data;
4.出栈的操作,int value=stack[top];top--,return valuel;
2.数组模拟栈的代码实现
package Stack;
public class ArrayStack {
private int[] stack;
private int top = -1;
private int maxsize;
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 n) {
if (isFull()) {
System.out.println("栈满");
return;
} else {
top++;
stack[top] = n;
}
}
//出栈
public int pop() {
if (isEmpty()){
throw new RuntimeException("栈空");
}else {
int value = stack[top];
top--;
return value;
}
}
//显示栈内数据
public void show(){
if (isEmpty()){
System.out.println("栈空");
}else {
for (int i = top; i >=0 ; i--) {
System.out.println(stack[i]);
}
}
}
}
- 测试:
package Stack;
import java.util.Scanner;
public class DemoStack {
public static void main(String[] args) {
System.out.println("请输入栈的容量");
Scanner scanner = new Scanner(System.in);
ArrayStack arrayStack = new ArrayStack(scanner.nextInt());
boolean loop = true;
char key = ' ';
while (loop) {
System.out.println("s,显示栈内数据");
System.out.println("o,出栈");
System.out.println("h,入栈");
System.out.println("e,退出");
key = scanner.next().charAt(0);
switch (key) {
case 's':
arrayStack.show();
break;
case 'o':
try{
arrayStack.pop();
}catch (Exception e){
System.out.println(e.getMessage());
}finally {
break;
}
case 'h':
System.out.println("输入数字为:");
arrayStack.push(scanner.nextInt());
break;
case 'e':
loop=false;
break;
}
}
}
}