概述
栈是一种操作受限的线性表,其限制是指仅允许在一端进行插入和删除操作。按照先进后出(First In Last Out )的原则存储数据,堆栈类似羽毛球筒,如果我们取羽毛球打开盖子取第一个羽毛球,往羽毛球同存放羽毛球也只能一个个往里放。
| 概念 | 说明 |
|---|---|
| 栈顶 | 允许进行插入和删除操作的一段被称为栈顶,栈的入口、出口的都是栈的顶端位置。 |
| 栈底 | 无法进行数据操作的一端被称为栈底 |
| 压栈/push | 就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。 |
| 出栈/pop | 就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。 |
栈ADT
public interface Stack<E> {int getSize();boolean isEmpty();void push(E e);E pop();E peek();}
@Overridepublic int size() {return top;}@Overridepublic boolean isEmpty() {return top==0;}@Override/*** 压栈*/public void push(Item e) {if (size()== stack.length){expandCapacity();}stack[top]=e;top++;}/*** 栈扩容*/private void expandCapacity(){stack = Arrays.copyOf(stack,stack.length*2);}@Override/*** 出栈 返回当前栈顶元素*/public Item pop() {if (isEmpty())throw new EmptyStackException();top--;Item item = stack[top];return item;}@Overridepublic Item peek() {if (isEmpty())throw new EmptyStackException();return stack[top-1];}
数组实现
import java.util.ArrayList;
public class ArrayStack<E> implements Stack<E> {
private ArrayList<E> list;
public ArrayStack(){
list = new ArrayList<E>();
}
@Override
public int getSize() {
return list.size();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public void push(E e) {
list.add(list.size(),e);
}
@Override
public E pop() {
if (!isEmpty()){
return list.remove(list.size()-1);
}
return null;
}
@Override
public E Peek() {
if (!isEmpty()){
return list.get(list.size()-1);
}
return null;
}
@Override
public String toString(){
return list.toString();
}
}
链表实现
public class LinkedStack <Item> implements Iterator<Item> {
private class Node{
Item item;
Node next;
public Node(Item item, Node next) {
this.item = item;
this.next = next;
}
}
private Node first;//栈顶元素
private int size;//栈元素总数
private Node currNode;
public void push(Item item){
first = new Node(item,first);
currNode = first;
size++;
}
public Item pop(){
Node currFirst = first;
first = currFirst.next;
currNode = first;
size--;
return currFirst.item;
}
public boolean isEmpty(){
return size==0;
}
public int getSize() {
return size;
}
@Override
public boolean hasNext() {
return currNode!=null;
}
@Override
public Item next() {
Item item = currNode.item;
currNode = currNode.next;
return item;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
