栈
stack栈
栈是一个先入后出有序列表
栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一个特殊线性表。
允许插入和删除的一端,为变化的一端,为栈顶,另一端为固定的一端,为栈底
根据栈定义:最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素,最后放入的元素最先删除,最先放入的元素最后删除
应用场景:1)子程序的调用:在跳往子程序前,会将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
2)处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
3)表达式的转换(中缀表达式转后缀表达式(笔试面试经典))与求值(实际解决)
4)二叉树的遍历
5)图形的深度优先搜索法(depth-first)
入栈push 出栈pop
1 import java.util.Scanner; 2 3 public class ArrayStackDemo { 4 public static void main(String[] args) { 5 //测试 6 7 ArrayStack stack = new ArrayStack(4); 8 String key = ""; 9 boolean loop = true;//控制是否退出菜单 10 Scanner scanner = new Scanner(System.in); 11 12 while (loop) { 13 System.out.println("show:表示显示栈"); 14 System.out.println("exit:退出"); 15 System.out.println("push:入栈"); 16 System.out.println("pop:出栈"); 17 System.out.println("请输入你的选择"); 18 key = scanner.next(); 19 switch (key) { 20 case "show": 21 stack.list(); 22 break; 23 case "push": 24 System.out.println("请输入一个数"); 25 int value = scanner.nextInt(); 26 stack.push(value); 27 break; 28 case "pop": 29 try { 30 int res = stack.pop(); 31 System.out.printf("出栈的数据是%d\n", res); 32 } catch (Exception e) { 33 System.out.println(e.getMessage()); 34 } 35 break; 36 case "exit": 37 scanner.close(); 38 loop = false; 39 break; 40 default: 41 break; 42 } 43 } 44 System.out.println("程序退出"); 45 46 } 47 } 48 49 //定义一个ArrayStack表示栈 50 class ArrayStack { 51 private int maxSize; //栈的大小 52 private int[] stack; //数组,数组模拟栈,数据放在该数组 53 private int top = -1;//top表示栈顶,初始化为-1 54 55 //构造器 56 public ArrayStack(int maxSize) { 57 this.maxSize = maxSize; 58 stack = new int[this.maxSize]; 59 } 60 61 //栈满 62 public boolean isFull() { 63 return top == maxSize - 1; 64 } 65 66 //栈空 67 public boolean isEmpty() { 68 return top == -1; 69 } 70 71 //入栈-push 72 public void push(int value) { 73 //先判断栈满 74 if (isFull()) { 75 System.out.println("栈满"); 76 return; 77 } 78 top++; 79 stack[top] = value; 80 } 81 82 //出栈-pop 将栈顶的数据返回 83 public int pop() { 84 //先判断栈是否空 85 if (isEmpty()) { 86 //抛出异常 87 throw new RuntimeException("栈空,没有数据"); 88 } 89 int value = stack[top]; 90 top--; 91 return value; 92 } 93 94 //显示栈的情况,遍历时,需要从栈顶开始显示数据 95 public void list() { 96 if (isEmpty()) { 97 System.out.println("栈空,没有数据"); 98 return; 99 } 100 //从栈顶显示数据 101 for (int i = top; i >= 0; i--) { 102 System.out.printf("stack[%d]=%d\n", i, stack[i]); 103 } 104 } 105 }