棧
后進先出
棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
API
public class StackOfString//儲存字符串的棧
StackOfString()//創建對象
void push(String item)//入棧
String pop()//出棧
boolean isEmpty()//判斷棧是否為空
int size()//棧中對象數目
示例
- 空棧什么也沒有
- push('a')
graph BT 1(a,棧底,棧頂)
- push('b')
graph TD 2(b,棧頂)==>1(a,棧底)
- push('c')
graph TD 2(b)==>1(a,棧底) 3(c,棧頂)==>2
- pop()
graph TD 2(b,棧頂)==>1(a,棧底)
鏈表棧
令棧頂指向棧底方向,保存指向棧頂元素的引用,可以提高入棧出棧的效率
Code by java
public class StackOfString {
private class Node{//內部類
String item;//存儲的String對象
Node next;//指向下一個Node的引用
}
private Node first=null;//初始棧頂對象為空
public boolean isEmpty(){//判斷棧是否為空,只要看first是否等於null
return first==null;
}
public void push(String item){//添加元素
Node oldfist=first;//拷貝first
first=new Node();//令first指向新的Node
first.item=item;//新Node存儲的字符串為傳入的參數
first.next=oldfist;//令新的Node的next等於舊的first,也就是說令新的棧頂元素指向舊的棧頂元素
}
public String pop(){//刪除元素
String item=first.item;//拷貝棧頂元素存儲的字符串
first=first.next;//令棧頂元素指向它的下一個元素
return item;
}
}
數組棧
數組棧使用一個數組當作棧,好處是節省了空間,缺點是長度固定,有多余空間,而且有下標越界的風險,
public class FixedCapacityStackOfString {
private String[] s;
private int N=0;//N表示棧頂元素的下一個元素的下標
public FixedCapacityStackOfString(int capacity){//根據傳入的capacity確定字符串數組的長度
s=new String[capacity];
}
public boolean isEmpty(){
return N==0;//如果N等於0,即棧頂元素的下一個元素為0,則棧為空
}
public void push(String item){//入棧
s[N++]=item;//注意!!這里的意思是,先給數組s的N下標位置賦值,然后N=N+1
}
public String pop(){
String item=s[--N];//注意!!這里的意思是,先N=N-1,然后給數組s的N下標位置的字符串拷貝下來
s[N]=null;//令棧頂元素的下一個元素為null,即使得垃圾回收器可以回收這部分空間
return item;//返回拷貝的字符串
}
}