棧和隊列都是屬於兩種特殊的線性表,棧是隻能夠在表尾執行插入和刪除操作,也就是先進後出,但是隊列則是先進先出,只能夠在隊列的頭部出,在尾部進行添加,棧和隊列在實際中的應用還是比較多的,棧在迷宮,棋類,機器學習方面用處是比較多的,隊列的話對現實生活中的一些排隊問題的解決,模擬一些離散的事件。
棧的應用,在這通過java中的LinkList的addFirst和removeFirst,getFirst,removeAll來模擬棧的相關操作。每次添加數據將數據添加到第一位,然後之前插入的數據將會被向後移,我們通過getFirst獲得數據就是在當前棧的頂部的了。LinkList底層是通過雙向鏈表來實現的,在這裏通過 LinkList來模擬棧和隊列的實現而不是通過ArrayList來模擬的原因是,ArrayList的底層實現是通過數組來實現的,所以說其大小是一開始就分配好的了,隨着插入數據的增加,然後不斷的爲其分配內存,底層是通過順序表來實現的,所以說執行插入刪除操作的時候是比較麻煩的,但還對其遍歷是比較方便的,LinkList是通過鏈表,所以刪除,插入等操作是比較方便的,但是遍歷是比較的。棧和隊列執行的操作主要是插入,刪除,所以用LinkList來模擬。
代碼實例:
<span style="font-size:18px;">public Class Stack <T>{
private LinkList <T> data = new LinkList <T> ();
public void push (T) {
data.addFirst(T);
}
public T peek (){
return data.getFirst();
}
public T pop (){
return data.removeFirst();
}
public boolean empty (){
return data.isEmpty();
}
public void clearAll () {
data.removeAll ();
}
}</span>
完成了棧的相關模擬,我們可以通過棧來完成一些操作了,模擬一些現實情況。
<span style="font-size:18px;">//將十進制數轉化爲八進制數
public void convertNum (int a){
Stack <int> stack = new Stack <int> ();
while (a/8 != 0){
stack.push(a%8);
a = a/8;
}
stack.push(a%8);
for (int i: stack)
system.out.print(stack.pop());
}
//檢測輸入文字中的括號是否匹配完整
public boolean testBracket (String s){
char a [] = s.toCharArray ();
Stack <String> stack = new Stack <String> ();
for (int i = 0; i < = a.length; i++){
if (a[i] == '{' || a[i] == '(')
stack.push(a[i]);
else if (a[i] == '}' || a[i] == ')')
stack.pop();
}
if (stack.empty())
return true;
return false;
}
//行編輯程序的模擬,退格符是#,退行符是@,
public void lineEdit (String s){
char a [] = s.toCharArray();
Stack <String> stack = new Stack <String> ();
for (int i = 0; i < a.length; i++){
if (a[i] != '#' && a[i] != '@')
stack.push(a[i]);
else if (a[i] == '#'){
if (stack.empty())
stack.push (a[i]);
else
stack.pop();
}
else
stack.clearAll();
}
} </span>
對於棧,在遞歸中用到的,通過一個遞歸工作棧,來盛放當前處在工作狀態的函數,遞歸的過程中首先放入的必定是最後執行,類似於棧的先進後出,這樣來標記遞歸函數在執行的過程中,各個變量之間的數量變化,能夠很清晰的看到遞歸執行的整個過程。
通過LinkList來模擬隊列的實現,和棧唯一不同的地方就是在數據插入的時候,棧需要我們在第一個位置處進行插入,但是在隊列中,我們是直接在其尾部進行插入的。
<span style="font-size:18px;">public Class Queue <T>{
private LinkList <T> queue = new LinkList <T> ();
public void push (T){
queue.add(T);
}
public T peek (T){
return queue.getFirst();
}
public T pop (T){
return queue.removeFirst();
}
public boolen empty (){
return queue.isEmpty();
}
public void clearAll (){
queue.removeAll();
}
}</span>