簡單計算器 兩種方法

2021-10-03 12:58:06 字數 1710 閱讀 3940

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

輸入:

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 讀入乙個只包含 的非負整數計算表示...