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 }