棧 簡易計算器

2021-08-20 21:41:32 字數 1547 閱讀 2806

題目描述:

讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。

輸入:測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。

輸出:對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。

樣例輸入:

1 + 2

4 + 2 * 5 - 7 / 11

0

樣例輸出:

3.00

13.36

解題思路:

能夠用語言描述演算法過程,是正確程式設計的第一步。

設立兩個堆疊,乙個儲存運算子,另乙個儲存數字。

從左至右遍歷字串,若遇到操作符,則比較該操作符與棧頂操作符優先順序大小。如果棧為空,或者該操作符優先順序比棧頂操作符的優先順序大,則將該操作符壓入棧;否則,若該操作符不大於棧頂操作符,則彈出棧頂操作符,然後從數字棧中彈出兩個棧頂數字完成運算後壓入數字棧,重複比較該操作符與棧頂操作符優先順序大小,直到該操作符優先順序比棧頂操作符的優先順序大,則將該操作符壓入棧;

若遍歷結束時,取出數字棧中數字就是所求。

實現上的技術:

對操作符編號,使用乙個優先順序矩陣判斷優先順序大小;

在表示式的首尾新增標記運算子,該運算子優先順序最低;

使用gets讀取一行,然後呼叫函式getop,不斷取節點

使用double型別儲存運算結果和數字棧型別

**:

#include #include #include #includeusing namespace std;

char str[201];

stackop;

stacknum;

//優先順序矩陣

//運算子編碼:

//0 首尾

//1:+

//2:-

//3:*

//4:/

int mat[5][5]=;

void getop(bool &reto,int &retn,int &i)

if(str[i]==0)

if(str[i]>='0'&&str[i]<='9')

if(str[i]==' ')

return;

}else

i+=2;

return; }}

int main()

while(!num.empty())

int idx=0;

bool retop;

int retnum;

while(true)elseelse if(tmpop==2)else if(tmpop==3)else if(tmpop==4)

num.push(tmpnum);

}op.push(retnum);//不要忘了壓入棧 不要忘了壓入棧 不要忘了壓入棧

}}else

if(op.size()==2&&op.top()==0)

} printf("%.2f\n",num.top());

}}

棧實現簡易計算器

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

利用棧實現簡易計算器

輸入數學表示式,輸出結果。其中符號支援加減乘除 乘方及括號,數字支援小數及負數。開兩個陣列,乙個陣列為符號棧,乙個陣列為數字棧。字串讀入表示式並逐位處理,有數字就擷取下來存入數字棧,運算符號截下來存入符號棧,若發現當前符號優先順序小於等於前乙個符號的優先順序,就要把前面那部分的值計算出來,例如3 2...

簡易計算器

include include include char xpr expression int level char ch double calc int lim return ret int main cal的遞迴使用,利用了當 運算子運算完畢以後,仍然會留在這個位置 比如式子 3 5 2 的分析...