数据结构 -线性结构 ->栈
栈:和队列相反的作用,越是先存入的数据就得越到后才能取出,根据这个特性可以用数组或链表模拟出栈。
数组模拟栈:添加数据正常顺序,每天加一个数栈顶加一次,弹栈的时候将栈顶指针的数弹出即可,遍历栈数组时是从栈顶开始循环。
1 class ArrayStack{ 2 private int maxSize;//栈的最大容量 3 private int[] stack;//初始数组模拟栈 4 private int top = -1;//初始栈顶指针 5 public ArrayStack(int maxSize){ 6 this.maxSize = maxSize; 7 stack = new int[this.maxSize]; 8 } 9 //判断栈是否已满 10 public boolean isFull(){ 11 return top == maxSize-1; 12 } 13 //判断栈是否为空 14 public boolean isEmpty(){ 15 return top == -1; 16 } 17 //压栈 18 public void push(int num){ 19 //先判断栈是否满了 20 if(isFull()){ 21 System.out.println("栈已满"); 22 return ; 23 } 24 top++; 25 stack[top] = num; 26 } 27 //弹栈 28 public int pop(){ 29 //先判断栈是否空 30 if(isEmpty()){ 31 throw new RuntimeException("栈为空,无数数弹出!") ; 32 } 33 int temp = stack[top]; 34 top --; 35 return temp; 36 } 37 //遍历栈,显示栈中数据 38 public void showStack(){ 39 if(isEmpty()){ 40 System.out.println("栈为空,无数数弹出!"); 41 return; 42 } 43 for(int i = top; i >=0; i--){ 44 System.out.printf("stack[%d] = %d\n",i,stack[i]); 45 } 46 } 47 }
单向链表模拟栈:使用头插法来添加数据实现栈,零时变量先指向链表头节点后第一个数,插入的数据先连接头节点的next,然后再将插入数据的next域指向临时变量即可。
1 class LinkedStack { 2 Stack head = new Stack(-1); 3 public boolean isEmpty() { 4 return head.getNext() == null; 5 } 6 /** 7 * 压栈 8 */ 9 public void push(Stack stack) { 10 11 //头插法将后输入的数据插入栈 12 Stack temp = head.getNext();//临时变量指向要被插队的数 13 head.setNext(stack);//插入最新输入的数 14 stack.setNext(temp);//连接被插队的数 15 } 16 /** 17 * 弹栈 18 */ 19 public int pop() { 20 if (isEmpty()) { 21 throw new RuntimeException("栈为空~"); 22 } 23 int num = head.getNext().getNum(); 24 head = head.getNext(); 25 return num; 26 } 27 /** 28 * 显示栈中的数据 29 */ 30 public void show() { 31 if (isEmpty()) { 32 System.out.println("栈为空!"); 33 return; 34 } 35 Stack temp = head; 36 while (true) { 37 if (temp.getNext() == null) { 38 break; 39 } 40 System.out.printf("satck = %d\n", temp.getNext().getNum()); 41 temp = temp.getNext(); 42 } 43 } 44 } 45 46 class Stack { 47 private int num; 48 private Stack next; 49 public Stack(int num) { 50 this.num = num; 51 } 52 public void setNext(Stack next) { 53 this.next = next; 54 } 55 public Stack getNext() { 56 return next; 57 } 58 public int getNum() { 59 return num; 60 } 61 }

浙公网安备 33010602011771号