数据结构 -线性结构 ->栈

栈:和队列相反的作用,越是先存入的数据就得越到后才能取出,根据这个特性可以用数组或链表模拟出栈。

数组模拟栈:添加数据正常顺序,每天加一个数栈顶加一次,弹栈的时候将栈顶指针的数弹出即可,遍历栈数组时是从栈顶开始循环。

 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 }

 

posted @ 2020-09-24 10:49  sixsixman  阅读(133)  评论(0)    收藏  举报