讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
輸入:這種型別題寫了很多,但每次變化一點點就會卡很久,而且中綴轉字尾也一直不熟練。。今天再用兩種方法總結一次1 + 2
4 + 2 * 5 - 7 / 11
0輸出:
3.00
13.36
相比於之前寫的中綴式轉字尾式,遇到的問題有:
常量不再用a,b,c表示,而是具體的常數,這就導致不再能用乙個字元棧來儲存字尾表示式,必須將運算元從字串中提取並組合起來,再用運算元棧和運算子棧分開存放。
總是思維慣性的想著求出字尾式之後,再用乙個棧對字尾式求值,然而在不能用乙個字元棧存字尾式的情況下,這是很複雜的。其實可以在每次向字尾式新增運算子時直接求值啊!
56和61兩行寫錯了,在vs下才找出問題
#include
using
namespace std;
map<
char
,int
> isp;
map<
char
,int
> icp;
stack<
double
> num;
//運算元棧
stack<
char
> s;
//運算子棧
string str;
//鍵盤輸入的中綴式
string post;
//字尾式 但在本題中,每次向字尾式新增運算子時 改為直接計算即可,故無需用到字尾式
intgetnum
(int i)
num.
push
(numb)
;return i;
}void
cal(
char op)
}int
main()
s.push
(str[i]);
//差點忘記 }}
}while
(!s.
empty()
)printf
("%.2f\n"
,num.
top())
;//棧頂元素即為最終答案
}}
這種方法很貼近正常思維,先對*/運算,再對+ -運算,最後統一運算。
但問題是如果題目中還要求考慮括號對優先順序的影響,怕是就無能為力了,但不失為乙個好方法。
#include
using
namespace std;
intmain()
;double nums[
201]=;
while
(cin>>d)
//取第乙個運算元
}double sum =0;
while
(pos >=0)
sum +
= nums[pos--];
//最後統一進行加運算
printf
("%.2f\n"
, sum)
;getchar()
;}return0;
}
C實現計算器(多種方法)
最普遍也是最基礎就是用switch開關語句實現,很簡單,也很好像將switch放在乙個死迴圈中然後在迴圈內輸入input的值來呼叫不同四個函式。這個 寫得很挫,而且很基礎了所以還有下面用函式指標,以及指標陣列來完成的簡單操作。define crt secure no warnings 1 inclu...
簡單計算器
unit unit1 inte ce uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls,buttons,math math是數 算單元 type tform1 class ...
簡單計算器
a 簡單計算器 crawling in process.crawling failed time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 讀入乙個只包含 的非負整數計算表示...