栈:数组模拟栈
栈的介绍
- 栈的英文为(stack)。
- 栈是一个先入后出(FILO-First In Last Out)的有序列表。
- 栈(stack)是一个限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
- 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素为栈顶,而删除元素则相反,最后放入的元素最先删除,最先放入的最后删除。
栈的应用场景
- 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
- 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存到堆栈等数据中。
- 表达式的转换【中缀表达式转后缀表达式】与求值(实际解决)。
- 二叉树的遍历。
- 图形的深度优先(depth-first)搜索法。
栈的快速入门
- 数组模拟栈的使用,由于栈是一种有序列表,当然可以使用数组的结构来储存栈的数据内容。
- 实现思路分析,思路图如下:
代码实现
1 package com.jyj.stack; 2 3 import java.util.Scanner; 4 5 public class ArrayStackDemo { 6 public static void main(String[] args) { 7 System.out.println("测试stack~~~"); 8 Scanner scan = new Scanner(System.in); 9 boolean loop = true; 10 String key; 11 ArrayStack stack = new ArrayStack(4); 12 13 while(loop) { 14 System.out.println("show:显示栈"); 15 System.out.println("exit:退出程序"); 16 System.out.println("push:入栈"); 17 System.out.println("pop:出栈"); 18 System.out.println("请输入你的选择:"); 19 key = scan.next(); 20 switch(key) { 21 case "show": 22 stack.list(); 23 break; 24 case "exit": 25 scan.close(); 26 loop = false; 27 break; 28 case "push": 29 System.out.println("请输入一个数:"); 30 int value = scan.nextInt(); 31 stack.push(value); 32 break; 33 case "pop": 34 try { 35 System.out.printf("出栈的数据是%d\n",stack.pop()); 36 }catch (Exception e){ 37 System.out.println(e.getMessage()); 38 } 39 break; 40 default: 41 break; 42 } 43 } 44 } 45 } 46 47 //定义ArrayStack表示栈 48 class ArrayStack { 49 private int maxSize; //栈的大小 50 private int top = -1; //栈顶,初始化为-1 51 private int[] stack; 52 53 public ArrayStack(int size) { 54 maxSize = size; 55 stack = new int[maxSize]; 56 } 57 58 //栈满 59 public boolean isFull(){ 60 return top == maxSize - 1; 61 } 62 //栈空 63 public boolean isEmpty(){ 64 return top == -1; 65 } 66 //入栈-push 67 public void push(int value) { 68 if(isFull()){ 69 System.out.println("栈满"); 70 return; 71 } 72 top++; 73 stack[top] = value; 74 } 75 76 //出栈-pop 77 public int pop(){ 78 if(isEmpty()){ 79 throw new RuntimeException("栈空"); 80 } 81 int value = stack[top]; 82 top--; 83 return value; 84 } 85 86 //显示栈[遍历数据] 87 public void list(){ 88 //判空 89 if(isEmpty()){ 90 System.out.println("栈空,没有数据"); 91 } 92 //遍历 93 for(int i = top;i >= 0;i--) { 94 System.out.printf("stack[%d] = %d\n",i,stack[i]); 95 } 96 } 97 }
以上。
朱子家训说:宜未雨而筹谋,勿临渴而掘井。
任何事情要到了跟前才想解决办法,那我们岂不很被动!