表示式求值

2021-08-22 08:37:07 字數 1983 閱讀 6615

實現輸入乙個表示式求出它的值的計算器,比如輸入:「1+2/4=」,程式就輸出1.50(結果保留兩位小數)

第一行輸入乙個整數n,共有n組測試資料(n<10)。 每組測試資料只有一行,是乙個長度不超過1000的字串,表示這個表示式,每個表示式都是以「=」結束。這個表示式裡只包含+-*/與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入的運算元中不會出現負數。 資料保證除數不會為0

每組都輸出該組表示式的運算結果,輸出結果保留兩位小數。

2

1.000+2/4=

((1+2)*5+1)/4=

1.50

4.00

/*先定義兩個棧,乙個資料棧,乙個字元棧,輸入字元s[1],長度l=strlen(&s[1]),記錄的長度是s1之後的長度,

在每乙個放字元的棧點都在其首端放上個左括號,在末端放上個右括號,**中只有乙個for迴圈,從0到l,

(1):先判斷s[i]是否等於左括號 ,等於的話把它壓棧到字元棧裡面,

(2):再判斷是否為數字,再用乙個while語句判斷是整數還是小數,如果是小數,即s[i]='.',

定義乙個double變數v=0和乙個整形變數b=0,b用來記錄小數點的位置,i-b就是小數點後面的位數,如果s[i]!=0,

v=v*10+pow(10,i-b);i++;當不滿足while條件時,退出迴圈,i-- ,如果為小數時,v/pow(10,i-b)就是那個小數

把它壓棧到資料段裡面 

(3):再判斷是否為'+'或'-',再判斷是否滿足while條件,即while(zf.top()!='(');滿足的話

定義三個double變數,a,b,c;a是資料棧棧頂元素,取出並刪除,b也是資料棧棧頂元素,

取出並刪除,再進入switch()分支語句,switch裡面是字元棧棧頂元素,c是結果,把結果壓棧到資料棧,並刪除運算過的字元

不滿while條件的話,則把字元壓棧到字元棧裡面

(4):再判斷是否為'*'或'/',這個不用設定while條件,直接判斷是'*'還是'/',不過還是要定義三個變數,a,b,c;

把a*b或a/b壓棧到資料棧裡面 ,並刪除運算過的字元

(5):再判斷是否為右括號,是的話,再判斷是否滿足while條件,即while(zf.top()!='(');滿足的話,過程和第三個一樣

,不過while外面最後的是刪除字元棧棧頂元素;

(6):最後即可輸出資料棧裡面的元素,並刪除。

*/ #include

#include

#include

#include

using namespace std;

char s[1010];

stacksj;//定義兩個棧,乙個資料棧,乙個字元棧 

stackzf;

int main()

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

//當s[i]不是數字和小數點的話,退出while迴圈 

i--;//i-- 

if(b!=0)//有小數點時,b不為0 

else

sj.push(v);

}else if(s[i]=='+'||s[i]=='-')

sj.push(c);//把結果壓棧到資料段裡面 

zf.pop();//並刪除剛剛運算過的字元 

}zf.push(s[i]);//不滿足while條件,就把字元壓棧到字串裡面 

}else if(s[i]=='*'||s[i]=='/')

else if(zf.top()=='/')

zf.push(s[i]);

}else if(s[i]==')')

sj.push(c);//然後把結果c壓棧到資料棧中 

zf.pop();//刪除字元棧 ,也就是刪除我們運算過的字元 

}zf.pop();//再刪除字元棧棧頂元素 }}

printf("%.2lf\n",sj.top());

sj.pop();}}

表示式求值

程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...

表示式求值

既然是表示式求值,自然需要在記憶體中儲存計算結果以及中間值。在 用c語言寫直譯器 一 中提過 變數要求是若型別,而 c 語言中的 view plaincopy to clipboardprint?in basic io.h define memery size 26 typedef enum var...

表示式求值

寫了乙個下午,各種糾結,各種問,終於搞明白了。但是自己還是想出來的一點東西的。很爽歪歪的,哈哈。先貼第一次的 include include include include include includeusing namespace std char data 7 7 int sign char ...