7、栈-数组模拟一个栈

来源:https://www.bilibili.com/video/BV1B4411H76f?p=28

一、栈

1、是一个先入后出的有序列表;

2、插入删除数据时,栈顶的指针会发生变化,栈底是固定的;

3、先插入的数据放在栈底,后插入的数据更接近栈顶,删除是从栈顶开始删除,最后才到栈底。

二、数组模拟栈的思路

1、定义一个指向栈顶的指针top,初始化为-1,定义代表栈的数组stack;

2、当向栈中压入数据时,【top++】,【stack[top]=data】;

3、当从栈中弹出数据时,弹出来的数据【value=stack[top]】,同时【top--】。

三、实现

 1、创建一个数组模拟栈的类ArrayStack,其中包含的属性有:栈的大小maxSize,指向栈顶的指针top,初始值为-1,用来存放数据的数组arr。类中目前包含一个入栈的方法,由于入栈时必须保证栈是不满的,因此额外增加了一个判断栈满的方法;为了检测方法的有效性,加入了一个展示方法,通过遍历展示栈中的内容;想要得到栈中的内容必须保证栈是非空的,所以又添加了一个判断栈为空的方法。

 1 public class ArrayStack {
 2     private int maxSize;//栈的大小
 3     private int top = -1;//栈顶指针
 4     private int[] arr;//模拟栈的数组
 5 
 6     public ArrayStack(int maxSize) {
 7         this.maxSize = maxSize;
 8         arr = new int[maxSize];
 9     }
10 
11     //判断当前栈是否已经满了
12     public boolean isFull(){
13         return top == maxSize - 1;
14     }
15     //判断栈是否为空
16     public boolean isEmpty(){
17         return top == -1;
18     }
19 
20     //入栈
21     public void push(int val){
22         if(isFull()){
23             System.out.println("栈满,无法添加数据");
24             return;
25         }
26         top++;
27         arr[top] = val;
28     }
29     //出栈
30 
31 
32     //展示
33     public void show(){
34         if(isEmpty()){
35             System.out.println("栈空,无法展示");
36             return;
37         }
38         for (int i = 0; i <= top; i++) {
39             System.out.printf("arr[%d]=%d",i,arr[i]);
40             System.out.println();
41         }
42     }
43 }

测试

 1     public static void main(String[] args) {
 2         ArrayStack arrayStack = new ArrayStack(5);
 3 
 4         arrayStack.show();
 5         System.out.println();
 6 
 7         arrayStack.push(1);
 8         arrayStack.show();
 9         System.out.println();
10 
11         arrayStack.push(2);
12         arrayStack.show();
13         System.out.println();
14 
15         arrayStack.push(3);
16         arrayStack.show();
17         System.out.println();
18 
19         arrayStack.push(4);
20         arrayStack.show();
21         System.out.println();
22 
23         arrayStack.push(5);
24         arrayStack.show();
25         System.out.println();
26 
27         arrayStack.push(6);
28         arrayStack.show();
29         System.out.println();
30     }

结果

栈空,无法展示

arr[0]=1

arr[0]=1
arr[1]=2

arr[0]=1
arr[1]=2
arr[2]=3

arr[0]=1
arr[1]=2
arr[2]=3
arr[3]=4

arr[0]=1
arr[1]=2
arr[2]=3
arr[3]=4
arr[4]=5

栈满,无法添加数据
arr[0]=1
arr[1]=2
arr[2]=3
arr[3]=4
arr[4]=5

2、在类中补充出栈的操作

 1     //出栈
 2     public int pop(){
 3         if(isEmpty()){
 4             System.out.println("栈空,无法操作");
 5             return -1;
 6         }
 7         int val = arr[top];
 8         top--;
 9         return val;
10     }

测试

 1         int pop = arrayStack.pop();
 2         System.out.println("出栈的数据为:"+pop);
 3 
 4         pop = arrayStack.pop();
 5         System.out.println("出栈的数据为:"+pop);
 6 
 7         pop = arrayStack.pop();
 8         System.out.println("出栈的数据为:"+pop);
 9 
10         pop = arrayStack.pop();
11         System.out.println("出栈的数据为:"+pop);
12 
13         pop = arrayStack.pop();
14         System.out.println("出栈的数据为:"+pop);
15 
16         pop = arrayStack.pop();
17         System.out.println("出栈的数据为:"+pop);

结果

出栈的数据为:5
出栈的数据为:4
出栈的数据为:3
出栈的数据为:2
出栈的数据为:1
栈空,无法操作
出栈的数据为:-1
原文地址:https://www.cnblogs.com/zhao-xin/p/13143316.html