(一)什么是栈?
-
举个例子,我们洗完盘子都通常都是叠在一起,先洗完的放最下面,其次洗的依次叠上面,当我们需要用盘子的时候,都是先从最上面取盘子,然后一个一个的拿走。这就是先进后出原则,即最先操作的最先进去,最后面操作的最先出去。
栈是一种只允许在一端进行插入或删除的线性表,也就是说先进后出即(FILO)。栈的操作端通常被称为栈顶,另一端被称为栈底,栈的插入操作称为压栈(push),栈删除操作称为出栈(pop)。压栈是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;出栈则是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
-
进栈
-
出栈
(二)栈的java实现
-
栈的实现方式有两种,顺序栈和链式栈,我们通常采用的是顺序栈。
-
定义个接口
public interface Stack{
//判断是否为空
boolean isEmpty();
//入栈
void push(Object obj);
//返回栈顶元素,不出栈
Object peek();
//返回栈顶元素,出栈
Object pop();
}
- 方法实现
public class ArrayStack implements Stack{
//栈为空
private int top=0;
//容量大小默认为10
private int capacity=10;
//存放元素的数组
private Object[] array;
//栈内元素个数
private int size;
//给栈设置大小,前一个是设置,后一个默认
public ArrayStack(int capacity) {
array = new Object[capacity];
}
public ArrayStack() {
array = new Object[this.capacity];
}
//返回元素个数
public int size() {
return size;
}
@Override
public boolean isEmpty() {
if(top==0)
return true;
else
return false;
}
//入栈
@Override
public void push(Object obj) {
//栈满 扩容
if(array.length == size)
ensureCapacity(size*2+1);
//从栈顶添加元素
array[top++] = obj;
size++;
}
//获取栈顶元素peek
public Object peek() {
if(isEmpty()) {
System.out.println("栈为空");
return false;
//或 new EmptyStackException();
}
return array[top-1];
}
//出栈
@Override
public Object pop() {
if(isEmpty()) {
System.out.println("栈为空");
return false;
//或 new EmptyStackException();
}
size--;
top--;
return array[top];
}
//扩容
public void ensureCapacity(int capacity) {
Object []a = array;
array = new Object[capacity];
for(int i=0; i<size ;i++)
array[i] = a[i];
}
public static void main(String[] args) {
ArrayStack s = new ArrayStack(2);
s.push("五");
s.push("6");
System.out.println(s.pop());
s.push("yi");
System.out.println(s.peek());
}
}
- 输出结果