數據結構 - 基於數組的棧
棧Stack
*棧也是一種線性數據結構
*相比數組,棧對應的操作是數組的子集
*只能從一端添加元素,也只能從這一端取出元素
*這一端稱為棧頂
*棧是一種後進先出的數據結構(Last in first out)
*在計算機的世界裏,棧擁有著不可思議的作用
棧的應用:
*無處不在的undo操作(撤銷)
*程序調用的系統棧(執行程序時,當一個子過程執行完成之後,可以自動回到上層調用中斷的位置繼續執行下去背後的原因就是有著一個系統棧來記錄每一次調用過程中中斷的位置)
*...
基於數組實現的棧結構源碼如下:
package stack;
public interface Stack<E> {
public void push(E e);
public E pop();
public E peek();
public int getSize();
public boolean isEmpty();
}
package stack;
import array.Array;
/**
* 基於數組的棧結構的實現
*
* @author zhangtianci
*
* @param <E>
*/
public class ArrayStack<E> implements Stack<E>{
Array<E> array; //基於數組的一個封裝
/**
* 構造函數
*
* @param capacity
* 棧的容量
*/
public ArrayStack(int capacity){
array = new Array<>(capacity);
}
/**
* 無參構造函數,默認容量為10
*
*/
public ArrayStack(){
array = new Array<>();
}
/**
* 獲取棧中元素的個數
*/
@Override
public int getSize(){
return array.getSize();
}
/**
* 查詢棧是否為空,為空則返回ture,反之false
*/
@Override
public boolean isEmpty(){
return array.isEmpty();
}
/**
* 向棧中壓入一個元素
*/
@Override
public void push(E e) {
array.addLast(e);
}
/**
* 彈出棧頂的元素
*/
@Override
public E pop() {
return array.removeLast();
}
/**
* 查詢棧的容量
*
* @return
*/
public int getCapacity(){
return array.getCapacity();
}
/**
* 看一眼棧頂的元素
*/
@Override
public E peek() {
// TODO Auto-generated method stub
return array.getLast();
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append(String.format("Capacity = %d, size = %d\n", getCapacity(),getSize()));
res.append("Stack: ");
res.append(‘[‘);
for(int i = 0; i < array.getSize(); i++){
res.append(i);
if (i != array.getSize() - 1) {
res.append(", ");
}
}
res.append("] top");
return res.toString();
}
}
為什麽getCapacity()方法沒有在接口中定義,卻在ArrayStack中定義?
因為只有在基於數組實現的棧才有capacity這個概念,所以此時應該在ArrayStack中定義這個方法。
基於數組的棧簡單復雜度分析
* void push(E e) : O(1) 均攤
*E pop(E e) : O(1) 均攤
*E peek() : O(1)
*int getSize() : O(1)
*boolean isEmpty() : O(1)
數據結構 - 基於數組的棧