攻無不克,「棧」無不勝。本文分享了一下棧的實現原理,以及乙個簡單的應用場景-簡易計算器。知彼知己,百「棧」不殆。
所有原始碼均已上傳至github:鏈結
public arraystack(int capacity) 複製**
public boolean push(int num) 複製**
public int pop
() 複製**
ps:按數字大小順序壓棧
鏈式棧則不需要像陣列呢樣在過載的構造方法初始化,直接宣告即可
public void push(int num)
head = node;
}複製**
public int pop
() 複製**
本次基於棧的簡易計算器僅包含加減乘除等四則元素,比如計算 7-1+2*3+12/2。對於這個運算來講 ,只是就是乙個表示式求值的過程,對人來講,口算都能算出來,可是對計算機來講,這個表示式很難理解,具體應該怎麼實現呢?
規則:這裡和常規數**算符一樣,先乘除後加減,不包含括號,輸入值為正整數。
1.我們可以把該運算通過宣告兩個棧來實現。乙個棧valstack用來儲存值,乙個棧calstack用來儲存運算子。
process中的for迴圈從左往右依次遍歷,當遇到數字的時候入棧valstack,遇到運算子的時候,先別忙入棧calstack,要先與棧b的棧頂元素進行比較,如果比棧頂元素優先順序高,則入棧calstack,如果優先順序低或者相同,則從棧valstack裡取兩個值,然後進行計算,再壓入棧valstack。
當for迴圈執行完畢的時候,valstack棧的值的數量應該是比calstack的值得數量多一。
在while迴圈裡將剩餘的操作做完,直到一方為空。
最後清空棧即可。
public void process(string str) else
print();
} while (!valstack.isempty() && !calstack.isempty())
valstack.clear();
calstack.clear();
}複製**
2.該方法就是當遇到操作符時開始判斷是入棧還是計算
private void caldeal(string opt) else
}} if (calstack.isempty())
}複製**
3.計算方法
private integer calulate(string opt, integer p, integer q)
return null;
}複製**
4.比較操作符的優先順序
private boolean compareoperator(string curcal, string tarcal)
return
true;
case
"*":
case
"/":
return
false;
default:
break;
} return
true;
}複製**
ps:該測試結果同時也將兩個棧的變化列印出來,一目了然
您的點讚和關注是對我最大的支援,謝謝!
棧與佇列知識點
一 讀取 include include 棧的標頭檔案 using namespace std intmain 輸入 123 輸出 123 二 刪除 include include 棧的標頭檔案 using namespace std intmain 輸入 123 456 輸出 123 三 判斷棧的...
棧與佇列 建立棧 佇列
陣列棧 完成stack createstack int maxelements 函式,該函式建立乙個棧,maxelements為與分配的棧空間大小 棧可用空間為array 0,maxelements 1 typedef int elemtype struct stackrecord typedef ...
資料結構(二) 棧棧與佇列
棧 stack 是限制插入和刪除只能在乙個位置上進行的表,該位置是表的末端,叫做棧頂 top 它是後進先出 lifo 的。對棧的基本操作只有push 進棧 和pop 出棧 兩種,前者相當於插入,後者相當於刪除最後的元素。實現 利用乙個單鏈表來實現棧的資料結構。而且,因為我們都只針對棧頂元素進行操作,...