實現輸入乙個表示式求出它的值的計算器,比如輸入:「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 ...