2020年2月28日
1.什麼是棧?
棧是一種用於存儲數據的簡單數據結構(與鏈表類似)。數據人棧的次序是棧的關鍵。可以把自助餐廳中的一堆盤子看作一個棧的例子。當盤子洗乾淨後,它們會添加到棧的頂端。當需要盤子時,也是從棧的頂端拿取。所以第一個放人棧中的盤子最後才能被拿取。
定義:棧(stack)是一個有序線性表,只能在表的一端(稱爲棧頂,top)執行插人和刪
除操作。最後插人的元素將第一個被刪除。所以,棧也稱爲後進先出(Last In First Out,LIFO)或先進後出(First In Last Out,FILO)線性表。兩個改變棧操作都有專用名稱。一個稱爲入棧(push),表示在棧中插入一個元素;另一個稱爲出棧(pop),表示從棧中刪除一個元素。試圖對一個空棧執行出棧操作稱爲下溢( underflow);試圖對一個滿棧執行人棧操作稱爲溢出(overflow)。通常,溢出和下溢均認爲是異常。
2.棧抽象數據類型
2.1棧的主要操作:
●void push(int data): 將data(數據)插人棧。
●int pop(): 刪除並返回最後一個插人棧的元素。
2.2棧的輔助操作
●int top(): 返回最後一個插人棧的元素,但不刪除。
●int size(): 返回存儲在棧中元素的個數。
●int isEmpty():判斷棧中是否有元素
●int isStackFull():判斷棧中是否存滿元素
3.實現
3.1簡單數組實現
public class ArrayStack{
private int top;
private int capacity;
private int[] array;
public ArrayStack(){
capacity = 1;
array= new int[capacity];
top = -1;
}
public boolean isEmpty(){
return (top == -1);
}
public boolean isStackFull(){
return (top == capacity- 1);
}
public void push(int data){
if(this.isStackFull())
System.out.println("棧滿");
else
array[++top]= data;
}
public int pop(){
if(this.isEmpty()){
System.out. println("棧空");
return 0;}
else
return ( array[top--]);
}
public void deleteStack(){
top = -1;
}
}
性能:
侷限性:棧的最大空間必須預先聲明且不能改變。試圖對一個滿棧執行入棧操作將產生一個簡單數組對這種特定實現棧方式的異常。
3.2基於動態數組實現方法
當棧滿時,倍增一個新的數組來,將原來的數組的元素儲存到新的數組中去,然後壓入新元素進棧。
public class DynArrayStack{
private int top;
private int capacity;
private int[] array;
public DynArrayStack(){
capacity= 1;
array= new int[capacity];
top = -1;
}
public boolean isEmpty(){
return (top == -1);
}
public boolean isStackFull(){
return (top == capacity- 1);
}
public void push(int data){
if(this.isStackFull())
this.doubleStack();
array[++top]= data;
}
private void doubleStack(){
int newArray[] = new int[capacity*2];
System.arraycopy(array, 0, newArray, 0, capacity);
capacity = capacity*2;
array = newArray;
}
public int pop() {
if(isEmpty()) System.out.println( "棧空");
else
return array[top--];
}
public void deleteStack(){
top = -1;
}
}
性能:
注意:倍增太多可能導致內存溢出
3.3基於鏈表的實現方法
public class LLStack{
private LLNode headNode;
public LStack(){
this.headNode = new LLNode(null);
}
public void Push(int data){
ifheadNode == null){
headNode = new LLNode(data);
}else if(headNode.getData() == null){
headNode.setData(data);
}else{
LLNode llNode = new LLNode(data);
llNode.setNext(headNode);
headNode = llNode;
}
}
public int top(){
if(headNode == null)
return null;
else
return headNode.getData());
}
public int pop(){
if(headNode == null){
throw new EmptyStackException("Stack empty");
}else{
int data = headNode.getData();,
headNode = headNode.getNext();
return data;
}
public boolean isEmpty0{
if(headNode == null)
return true;
else
return false;
}
public void deleteStack(){
headNode null;
}
}
性能: