標籤:
棧是一種“先去後出”的抽象的資料結構。例如:我們在洗盤子的時候,洗完一個盤子,將其放在一摞盤子的最上面,但我們全部洗完後,要是有盤子時,我們會先從最上面的盤子開始使用,這種例子就像棧的資料結構一樣,先放進去的資料,最後才能得到。
棧不僅在生活中有很多例子,在電腦方面使用的更為頻繁。如:大部分處理器運用基於棧的體繫結構,當調用一個方法時,把他的返回地址和參數壓入棧,當方法結束返回時,那些資料出棧。棧操作就嵌入在微處理器中。還有比如較老的計算機也是這樣,他們不是輸入帶括弧的算術運算式,而是把中間結果先存入棧中等等。
棧原理圖示:
棧代碼實現(下面還有分隔字元匹配例子的代碼):
棧類實現:
package com.dxx.stack;public class StackX { private int maxSize; private int[] stackArray; private int top; //構造器中初始化棧的數組,並將棧定索引置為-1,表示棧為空白。 public StackX(int maxSize) { super(); this.maxSize = maxSize; stackArray = new int[maxSize]; top = -1; } //判斷棧是否為空白,在出棧操作前都要先判斷棧是否空,若為空白,則不能出棧。 public boolean isEmpty(){ if(top == -1) return true; return false; } //判斷棧是否已滿,在入棧操作前都要先判斷棧是否已滿,若已滿,則不能入棧。 public boolean isFull(){ if(top == maxSize-1) return true; return false; } //入棧 public void push(int num){ if(!isFull()){ stackArray[++top] = num; }else { System.out.println("棧已滿,不能再進行入棧操作。"); } } //出棧 public int pop(){ if(!isEmpty()){ return stackArray[top--]; }else { System.out.println("棧為空白,不能擷取棧定元素"); return 0; } } //取棧頂元素 public int peek(){ if(!isEmpty()){ return stackArray[top]; }else { System.out.println("棧為空白,不能擷取棧定元素"); return 0; } }}
主程式測試:
package com.dxx.stack;public class StackMain { public static void main(String[] args) { StackX stackX = new StackX(5); stackX.peek(); stackX.push(0); stackX.push(1); stackX.push(2); stackX.push(3); stackX.push(4); stackX.push(5); System.out.println(stackX.pop()); System.out.println(stackX.pop()); System.out.println(stackX.pop()); }}
輸出結果:
棧為空白,不能擷取棧定元素棧已滿,不能再進行入棧操作。432
下面就是分隔字元匹配的例子代碼:
分析:
分隔字元棧的類:
package com.dxx.stack;public class BracketStackX { private int maxSize; private char[] stackArray; private int top; //構造器中初始化棧的數組,並將棧定索引置為-1,表示棧為空白。 public BracketStackX(int maxSize) { super(); this.maxSize = maxSize; stackArray = new char[maxSize]; top = -1; } //判斷棧是否為空白,在出棧操作前都要先判斷棧是否空,若為空白,則不能出棧。 public boolean isEmpty(){ if(top == -1) return true; return false; } //判斷棧是否已滿,在入棧操作前都要先判斷棧是否已滿,若已滿,則不能入棧。 public boolean isFull(){ if(top == maxSize-1) return true; return false; } //入棧 public void push(char ch){ if(!isFull()){ stackArray[++top] = ch; }else { System.out.println("棧已滿,不能再進行入棧操作。"); } } //出棧 public char pop(){ if(!isEmpty()){ return stackArray[top--]; }else { System.out.println("棧為空白,不能擷取棧定元素"); return 0; } } //取棧頂元素 public char peek(){ if(!isEmpty()){ return stackArray[top]; }else { System.out.println("棧為空白,不能擷取棧定元素"); return 0; } }}
字串匹配檢查類:
package com.dxx.stack;//定義一個檢查分隔字元是否匹配的工具列public class BracketCheck { private String input; public BracketCheck(String input) { super(); this.input = input; } public boolean chek(){ //先執行個體化有關分隔字元的棧 BracketStackX stackX = new BracketStackX(input.length()); //依次比較input的字元,如果是左分隔字元,就入棧,是右分隔字元,就出棧與右分隔字元匹配。 for(int i=0; i<input.length(); i++){ char ch = input.charAt(i); switch(ch){ case ‘{‘: case ‘[‘: case ‘(‘: stackX.push(ch); break; case ‘)‘: case ‘]‘: case ‘}‘: char ch2 = stackX.pop(); if(ch==‘)‘&&ch2==‘(‘ ||ch==‘]‘&&ch2==‘[‘ ||ch==‘}‘&&ch2==‘{‘){ }else { return false; } break; } } if(!stackX.isEmpty()){ return false; } return true; }}
主程式測試:
package com.dxx.stack;public class StackMain { public static void main(String[] args) { BracketCheck bracketCheck = new BracketCheck("123{{[4444(3333)fff]ddddd}"); if(bracketCheck.chek()) System.out.println("匹配"); else System.out.println("不匹配"); }}
結果為:不匹配。
大家有興趣還可以練習一個單子逆序顯示。
棧實現java