1.特點:遵循 “先進後出”的規則,棧主要包含兩個操作,“入棧” 和 “出棧”,棧這種數據結構有兩種實現方式:1.數組實現,2.鏈表實現。例如:瀏覽器的前進和後退功能就可以使用兩個棧來實現,程序中函數的調用也是通過棧來實現。
基於數組實現的叫做“順序棧”,基於鏈表實現的叫做“鏈式棧”。
空間複雜度的概念:除了必須存儲數據的空間外,還需要在程序運行時,需要額外的空間。在棧的入棧和出棧過程中,所需要的空間複雜度爲O(1)。
/*
* 使用數組來實現一個空間大小固定的棧*/
public class ArrayStack<E> {
/*定義一個數組*/
private Object[] elementData;
/*該棧空間的大小*/
private int size;
/*當前棧中存儲元素的個數*/
private int count;
public ArrayStack(int size) {
this.elementData = new Object[size];
this.size = size;
this.count = 0;
}
/*
* 入棧操作*/
public boolean push(Object element) {
/*棧中的數組空間如果不夠了,那麼直接返回false.
* 因爲count是從0開始的,size是從1開始的,所以當count == size時,不能再向棧中插入數據*/
if(count == size) return false;
/*如果數組可以存放數據,那麼放在count的位置*/
elementData[count] = element;
count++;
return true;
}
/*
* 出棧操作*/
public E pop() {
/*首先判斷棧中元素的個數是否爲空*/
if(count == 0) return null;
E element = (E)elementData[count-1];
count--;
return element;
}
public static void main(String[] args) {
//泛型針對的是”引用“而言,對於後面在堆中存儲的對象,不起約束作用
ArrayStack stack = new ArrayStack<String>(5);
for(int i=0;i<=5;i++) {
System.out.println(stack.push(i)+" ,"+i);
}
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
}
}
/**
*使用鏈表實現一個鏈式棧
*/
public class LinkedListStack<T> {
/*定義一個棧頂指針*/
private StackNode top = null;
/*入棧操作*/
public void push(Object value) {
StackNode newNode = new StackNode(value,null);
if(top == null) {
top = newNode;
}else {
/*首先設定新節點的後繼節點爲top,然後移動top指針,將top指向新節點*/
newNode.setNext(top);
top = newNode;
}
}
/*出棧操作*/
public T pop() {
if(top == null) return null;
/*將value類型強轉爲泛型類型*/
T value = (T)top.getValue();
top = top.getNext();
return value;
}
/*打印棧中的所有元素*/
public void printAllElements() {
if(top == null) return;
while (top != null) {
System.out.println(top.getValue());
top = top.getNext();
}
}
private class StackNode<T> {
/*節點值*/
private T value;
/*指向的下一個節點*/
private StackNode next;
public StackNode(T value,StackNode next) {
this.value = value;
this.next = next;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public StackNode getNext() {
return next;
}
public void setNext(StackNode next) {
this.next = next;
}
}
public static void main(String[] args) {
LinkedListStack<Integer> stack = new LinkedListStack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.pop();
stack.printAllElements();
}
}