計算器特性: 支援整型運算(±*/%),能夠處理運算子和運算元間的空格,支援括號
實現思路:
利用乙個運算元堆疊dgt和乙個運算子堆疊ops實現;
1、從左至右掃瞄運算表示式輸入,若為運算元則直接壓入dgt堆疊
2、若為運算子則判斷ops中是否已經存在運算子,不存在則直接壓入,存在則與棧頂運算子比較優先順序,優先順序高則直接壓入,否則就持續pop(每次pop就是取出dgt最頂上兩個數和ops棧頂的運算子作一次運算後將結果重新壓回dgt),直到找到乙個優先順序比當前運算子c低的或者堆疊空了。
3、最後到句末\n時再把之前沒有pop的運算全部pop掉,最終表示式的結果就是dgt[0]的值
#include
char ops[
100]
;int o_top =-1
;int dgt[
100]
;int d_top =-1
;void
pop()}
intprio
(char c)
}int
main()
else
if(c ==
'(')
else
if(c ==
')')
else
// 是運算子且優先順序不高於前乙個運算子
// if (ops[o_top] != '(' && prio(c) <= prio(ops[o_top]))
while
(o_top >=
0&& ops[o_top]
!='('
&&prio
(c)<=
prio
(ops[o_top]))
pop();
ops[
++o_top]
= c;}}
}while
(o_top >=0)
pop();
printf
("%d\n"
, dgt[0]
);getchar()
;}
測試用例:
// testcase: 3 * 5 / 4 + (7) * ((29) * 6 / (4 - 1 + 7 * 8 / 5 * 6 * 2 + 5 + 7 - 4)) --> 10
// testcase: 2+3-4*1+5%2 --> 2
實現乙個計算器
一直以來,我都想寫一門語言,但無從下手。我找到了很多編譯原理的教程,但始終覺得內容晦澀,理解不了,所以先嘗試寫乙個簡單的,比如 計算器。網上有很多關於計算器的實現,但大多需要有編譯原理的基礎,對於我這種小白實在難以理解。我決定採用暴力模擬的方式,需要用正規表示式,但我不想自己實現,所以用js。計算器...
實現乙個計算器
一直以來,我都想寫一門語言,但無從下手。我找到了很多編譯原理的教程,但始終覺得內容晦澀,理解不了,所以先嘗試寫乙個簡單的,比如 計算器。網上有很多關於計算器的實現,但大多需要有編譯原理的基礎,對於我這種小白實在難以理解。我決定採用暴力模擬的方式,需要用正規表示式,但我不想自己實現,所以用js。計算器...
Pythons實現乙個計算器
coding utf 8 from tkinter import def calculate result eval equ.get equ.set equ.get n str result def show buttonstring content equ.get if content 0 con...