概念
棧是一種只允許在一端進行插入或刪除的線性表(邏輯結構屬於操作受限的線性表)。
- 棧的操作端通常被稱爲棧頂,另一端被稱爲棧底。
- 棧的插入操作稱爲進棧(壓棧|push);棧刪除操作稱爲出棧(彈棧|pop)。
特點
棧中的元素是“先進後出”的特點,只允許在棧頂操作。
存儲結構
順序存儲的棧稱爲順序棧;鏈式存儲的棧稱爲鏈式棧。
Java實現
圍繞棧的4個元素來實現棧
- 2個狀態:是否棧空;是否棧滿。
- 2個操作:壓棧push;進棧pop。
順序棧的實現
順序棧示意圖:
順序棧的Java實現
public class SortStack {
public Object[] data; // 數組表示棧內元素
public int maxSize; // 棧空間大小
public int top; // 棧頂指針(指向棧頂元素)
/**
* 初始化棧的長度
* @param initialSize
*/
public SortStack(int initialSize){
if(initialSize>=0){
this.data=new Object[initialSize];
this.maxSize=initialSize;
this.top=-1;
}
else{
System.out.println("棧初始化失敗!");
}
}
/**
* 判斷棧是否爲空
* @return
*/
public boolean isEmpty(){
return top == -1 ? true : false;
}
/**
* 判斷是否棧滿
* @return
*/
public boolean isFull(){
return top == maxSize-1 ? true : false;
}
/**
* 入棧操作
* 先判斷是否棧滿
* @param value
*/
public void push(Object value){
if(!isFull()){
System.out.print(value+"入棧 ");
data[++top]=value;
}
else{
System.out.println("滿棧,無法進行入棧操作!");
}
}
/**
* 出棧操作
* 先判斷是否爲空棧
* @return
*/
public Object pop(){
Object num=null;
if(!isEmpty()){
num = data[top--];
return num;
}
else{
return "空棧,無法進行出棧操作!";
}
}
/**
* 獲取棧頂元素
* @return
*/
public Object getPeek(){
if(top>=0){
return data[top];
}
else{
return "棧頂指針爲空,無棧頂元素!";
}
}
/**
* 打印棧內元素
*/
public void displayStack(){
// 棧頂指針不爲—1,棧內有元素,進行打印
if(top>=0){
for(int i=top;i>=0;i--){
System.out.print(data[i] + " ");
}
System.out.println();
}
else{
System.out.println("棧內元素爲空!");
}
}
/**
* 獲取棧頂指針爲n的棧內元素
* @param n
* @return
*/
public Object getPeekN(int n){
if(n<top){
return data[n];
}
else{
return "error";
}
}
public static void main(String[] args) {
SortStack stack=new SortStack(3);
System.out.println("棧頂元素爲:"+stack.getPeek());
System.out.println("棧是否爲空:"+stack.isEmpty());
System.out.println("是否爲滿棧:"+stack.isFull());
System.out.println("++++++++");
stack.push(1);
stack.push('A');
stack.push(5);
stack.push("hello");
System.out.println("棧是否爲空:"+stack.isEmpty());
System.out.println("是否爲滿棧:"+stack.isFull());
System.out.println("棧頂指針爲:"+stack.top);
System.out.println("==========");
System.out.println("出棧後的棧頂元素爲:"+stack.pop());
System.out.println("出棧後的棧頂元素爲:"+stack.pop());
System.out.println("+++++++++++");
System.out.println("棧頂元素爲:"+stack.getPeek());
System.out.println("棧頂指針爲2的元素爲:"+stack.getPeekN(2));
System.out.println("棧頂指針爲9的元素爲:"+stack.getPeekN(9));
System.out.println("棧是否爲空:"+stack.isEmpty());
System.out.println("是否爲滿棧:"+stack.isFull());
System.out.println("**********");
System.out.print("棧內元素爲:");
stack.displayStack();
System.out.println("棧頂指針爲:"+stack.top);
}
}
Java代碼運行結果如下: