1.栈的基本概念

英语:stack)又称为堆叠,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

  栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。

  由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈也称为后进先出表。

  这里以羽毛球筒为例,羽毛球筒就是一个栈,刚开始羽毛球筒是空的,也就是空栈,然后我们一个一个放入羽毛球,也就是一个一个push进栈,当我们需要使用羽毛球的时候,从筒里面拿,也就是pop出栈,但是第一个拿到的羽毛球是我们最后放进去的。

 java模拟简单的顺序栈实现

代码如下:

 1 package array;
 2 
 3 public class MyStack {
 4     private int maxSize; //栈的最大容量
 5     private int top;      //栈顶元素
 6     private int[] array;  //定义一个数组
 7 
 8     public MyStack(int size) {
 9         this.maxSize = size;   //自定义最大容量
10         array = new int[size];
11         top = -1;  //数组第一个元素下标为零
12     }
13 
14     //压入数据
15     public void push(int value) {
16         if (top < maxSize - 1) {
17             array[++top] = value;   //++top先自增后参与运算
18         }
19     }
20 
21     //弹出栈顶数据
22     public int pop() {
23         return array[top--];  //弹出栈顶元素再自减一
24     }
25 
26     //访问栈顶数据
27     public int peek() {
28         return array[top];
29     }
30 
31     //判断栈是否为空
32     public boolean isEmpt() {
33         return (top == -1);
34     }
35 
36     //判断栈是否满了
37     public boolean isFull() {
38         return (top == maxSize - 1);
39     }
40 
41 }

 

Test:

 1 package array;
 2 
 3 public class MyStackTest {
 4     public static void main(String[] args) {
 5         MyStack stack = new MyStack(9);
 6         stack.push(5);
 7         stack.push(4);
 8         stack.push(6);
 9         stack.push(3);
10         stack.push(2);
11         stack.push(7);
12         stack.push(9);
13         stack.push(8);
14         stack.push(1);
15         System.out.println("栈顶元素为:"+stack.peek());
16         System.out.print("由顶至下:");
17         while (!stack.isEmpt()){
18             System.out.print(stack.pop()+" ");
19         }
20     }
21 }

 

 

增强功能版栈

第一个能自动扩容,第二个能存储各种不同类型的数据

 1 import java.util.Arrays;
 2 
 3 public class ArrayStack {
 4     private int maxSize;  //最大容量
 5     private int top;      //栈顶元素
 6     private Object[] allData;  //类型为Object,可以装任意类型数据
 7 
 8     public ArrayStack() {  //默认构造器
 9         this.maxSize=10;
10         this.top=-1;
11         this.allData=new Object[maxSize];
12     }
13 
14     public ArrayStack(int size) {  //自定义初始化最大容量
15         if (size<0){
16             throw new IllegalArgumentException("栈初始容量不能小于0:--"+size);
17         }
18         this.maxSize=size;
19         this.top=-1;
20         this.allData=new Object[size];
21     }
22 
23     //压入元素
24     public Object push(Object item){
25         isGrow(top+1);  //判断是否需要扩容
26         allData[++top]=item;
27         return item;
28     }
29 
30     //弹出栈顶元素
31     public Object pop(){
32         Object obj=peek(); //获取栈顶元素,之后再移除
33         remove(top);
34         return obj;
35     }
36 
37     //获取栈顶元素
38     public Object peek(){
39         return allData[top];
40     }
41 
42     //判断栈是否为空
43     public boolean isEmpt(){
44         return (top==-1);
45     }
46 
47     //删除栈顶元素
48     public void remove(int top){
49         allData[top]=null;  //置栈顶元素为空
50         this.top--;
51     }
52 
53     //是否需要扩容
54     public boolean isGrow(int fullSize){
55         int oldSize=maxSize;
56         if (fullSize>=oldSize){  //判断会不会超出最大容量
57             int newSize=0;
58             newSize=(oldSize<<1); //左移一位,容量翻倍
59             this.maxSize=newSize;60             allData= Arrays.copyOf(allData,maxSize);
61             return true;
62         }else {
63             return false;
64         }
65 
66     }
67 
68    } 

Test:

 1 public class ArrayStackTest {
 2     public static void main(String[] args) {
 3         ArrayStack stack = new ArrayStack(3);
 4         stack.push("success!");
 5         stack.push(233);
 6         stack.push("world!");
 7         stack.push("hello ");
 8         System.out.println(stack.peek());//获取栈顶元素
 9         System.out.print(stack.pop());
10         System.out.print(stack.pop());
11         System.out.println(stack.pop());
12         System.out.println(stack.peek());//现在只剩下一个元素
13     }
14 }

 

posted on 2018-08-22 21:27  蓝绿绿  阅读(158)  评论(0编辑  收藏  举报