利用棧實現簡易計算器

2021-09-19 11:54:39 字數 1946 閱讀 6457

輸入數學表示式,輸出結果。其中符號支援加減乘除、乘方及括號,數字支援小數及負數。

開兩個陣列,乙個陣列為符號棧,乙個陣列為數字棧。字串讀入表示式並逐位處理,有數字就擷取下來存入數字棧,運算符號截下來存入符號棧,若發現當前符號優先順序小於等於前乙個符號的優先順序,就要把前面那部分的值計算出來,例如3*2+2,*的優先順序高於+,所以先算3*2再算6+2。

如果遇到左括號直接進入符號棧,遇到了右括號就把右括號前的所有表示式的值計算出來,直到遇見左括號。

#include #include #include #include #include using namespace std;

#define maxn 5000

char c[maxn], oper[maxn];

double number[maxn];

int oper_num, num_num, p;

void work();

void calc();

void get_number();

void get_operator();

int get_priority(int n);

int main()

void work()

p++;

}oper[++oper_num] = ')';

while (oper_num > 1) calc();

}void calc()

number[num_num] = res;

}void get_number()

strncpy(c_num, c+start_p, n);

sscanf(c_num, "%lf", &number[++num_num]);

if (c[start_p-1] == '-' && (c[start_p-2] == '(' || start_p == 1))//若直接輸入負數(特徵是負號前為左括號),不可把負號處理為運算子

}void get_operator()

int get_priority(int n)

對於表示式1+2×(4-3)-1,我們可以將其以二叉樹的形式進行表達,如下圖:

葉節點為數字,非葉節點為操作符,優先順序越低的操作符深度越低,同優先順序後執行的操作會放在更靠近根的地方。(例如1+2-3,-後執行,為根節點)

通過上圖可知,1+2×4-3-1其實是該二叉樹的中序遍歷,其實就是我們所習慣的表示式去掉括號了而已。我們所習慣的這種帶括號的表示式稱為中綴表示式。雖然中序遍歷沒有括號,但括號內的內容是會被連續訪問的。如上圖,4-3作為優先順序最高的操作,處於樹的最深處,遍歷時是會作為乙個整體進行遍歷的,不會訪問到其他節點。

若對這樣的二叉樹進行先序遍歷及後序遍歷,可分別得到字首表示式與字尾表示式:-+1*2-431以及1243-*+1-。這兩類就沒有括號。不同於人類,計算機對字尾或字首表示式的邏輯會有更為便捷的處理,以後綴表示式為例:從左至右掃瞄字尾表示式,遇到數字直接進棧,遇到操作符,將操作符前的兩個數字出棧,並運算,結果入棧,直到棧空,以上圖舉個實際的例子:

首先,1、2、4、3依次入棧。

其次,讀到-,彈出棧中最外的兩個數字4和3,與-運算得到1,把1壓入棧,此時棧中為1、2、1。

再次,讀到*,彈出棧最外的兩個數2和1,運算得到2並壓入棧,此時棧中為1、2。

復次,讀到+,彈出1和2,運算後壓入3,此時棧中只有3乙個數字。

最後,遇到1,進棧,再讀到-,執行3-1得到2入棧,結束,最後結果為2。

若要將中綴表示式轉換為樹,可通過對表示式進行檢索,找到優先順序最低且後執行的乙個操作符,然後將該操作符左側表示式作為左子樹,右側表示式作為右子樹,並對兩子樹遞迴進行上述處理,從而構建出表示式樹,然後字尾遍歷即可。

若要將中綴表示式直接轉換為字尾表示式,思路其實和本文開頭程式思路差不多,這裡就不再贅述。

棧實現簡易計算器

計算數學表示式的值。輸入數學表示式,輸出表示式的計算結果。數學表示式由單個數字和運算子 構成,例如 2 3 4 5 6 4。include include include include using namespace std double result int tag template class...

棧 簡易計算器

題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。輸出 對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位...

實現簡易計算器

python 剛學python 老師帶著寫了乙個計算器。話不多說直接上 from tkinter import 匯入模組 top tk 設定視窗物件 top.title 計算器 設定視窗標題 v strin ar 接受使用者輸入的字元 v.set 0 設定字元預設值 isopera false 是否...