題目描述:表示式計算是實現程式語言的基本問題之一,也是棧的應用的乙個典型例子。設計乙個程式,演示用運算子優先法對算數表示式求值的過程。
基本要求:以字串行的形式從終端輸入語法正確的、不含變數的整數表示式。利用教科書表3.1給出的運算子優先關係,實現對算數四則混合運算表示式的求值,並仿照教科書的例3.1演示在求值中運算子棧、運算數棧、輸入字元和主要操作的變化過程。
測試資料:
1+2+3+4
88-15
1024/48
1024/(48)
(20+2)(6/2)
3-3-3
2*(6+2*(3+6*(6+6)))
(((6+6)*6+3)*2+6)*2
首先,將輸入的字元分為兩種型別:運算數和運算子。顧名思義,運算數就是參與運算的整數。運算子指加減乘除,左右括號以及『#』,其中『#』用於標記輸入的開始與結束,起乙個標識的作用。也就是說,使用者的輸入必須以『#』作為結束。
為實現上述程式功能,選擇棧用於儲存運算子與運算數,分別用兩個棧oprt和num來儲存。首先在oprt棧中壓入乙個『#』,用以提示程式表示式的邊界。從終端讀取資料:
①如果讀到的是數字字元,那麼表明現在正在輸入的是運算數。為了得到完整的數字,先將這些數字字元按順序儲存到緩衝區(temp棧),直到讀到運算子時,將緩衝區的數字按照權重相加,構造出完整的運算數,壓入運算數棧中去,同時清空temp棧。
②如果讀到的是運算子,那麼按照規則比較oprt棧頂運算子和此運算子的優先順序:(下列三種情況)
a.oprt棧頂運算子高於此運算子,則表明此時已經可以進行計算。將num棧依次出棧兩個元素a,b,則由b、oprt棧頂運算子、a構成了乙個簡單的表示式,對之進行計算,將結果壓入num棧。
b.oprt棧頂運算子低於此運算子,則先將這個運算子入棧,然後繼續讀取。
c.oprt棧頂運算子優先順序等於此運算子,例如左右括號匹配時、表示式頭『#』和尾『#』匹配時,則不將此運算子入棧,反而將oprt棧頂運算子出棧。
重複上述①②操作,直到oprt棧頂元素為『#』或讀取到的字元為『#』(結束)。此時num棧頂元素即為此表示式的結果。
上圖為運算優先順序關係圖
上**
#include
#include
#define defaultsize 10
#define increasesize 5
typedef
struct
oprtstack;
typedef
struct
numstack;
intcreatestack
(oprtstack*s)
intpop
(oprtstack *s,
char
*e)int
push
(oprtstack*s,
char e)
*(s->top)
=e; s->top++;}
intisempty
(oprtstack *s)
char
gettop
(oprtstack *s)
else
return
'!';
//這樣定義的話,棧裡面不能儲存!這個資料
}void
showstack
(oprtstack*s)
printf
(" ");
}//看起來**很多,其實下面的函式定義和上面的幾乎一模一樣,只是傳遞的引數不同而已
intcreatestack
(numstack*s)
intpop
(numstack *s,
double
*e)int
push
(numstack*s,
double e)
*(s->top)
=e; s->top++;}
intisempty
(numstack *s)
double
gettop
(numstack *s)
else
return-1
;//這樣定義的話,棧裡面不能儲存!這個資料
}void
showstack
(numstack*s)
printf
(" ");
}int
isoprt
(char c)
//判斷c是不是運算子
char
compare
(char a,
char b)
else
if(a==
'-')
else
if(a==
'*')
else
if(a==
'/')
else
if(a==
'(')
else
if(a==
')')
else
if(a==
'#')
}double
calculate
(double left,
double right,
char operators)
}int
main()
while(!
isempty
(&temp)
)//將讀取到的數字字元存入緩衝區,構建完整的運算數字
complex=1;
if(build)
push
(&num,
double
(build));
//將此運算數字壓入棧num
printf
("\n運算子棧:");
showstack
(&oprt)
;printf
("運算數棧:");
showstack
(&num)
;//每次壓棧彈棧都需要列印資訊
build=0;
if(isoprt
(c))
//讀入的是運算子 }if
(error)
break;}
if(!error)
printf
("結果為:%f"
棧的應用 算術表示式求值
選擇棧作為資料結構,所以所有操作都要圍繞棧的特點來進行。因為先入棧而被壓在下面的意味著要後處理,所以優先順序低的不能壓著優先順序高的而入棧。對於同級的操作符,因為要按照從左往右的運算規則,所以也不 能壓著同級的操作符而入棧。簡單來說,與棧頂的操作符比較,優先順序高的則入棧,否則操作符出棧作相應運 算...
算術表示式求值 棧的應用
注 實驗用書為 資料結構 c語言版 第2版,人民郵電出版社出版。實驗題目 學生管理系統的設計與實現 實驗環境 visual c 6.0或其他c 環境 一 實驗目的 1 掌握棧的定義及實現 2 掌握利用棧求解算術表示式的方法。二 實驗內容 通過修改完善教材中的演算法3.4,利用棧來實現算術表示式求值的...
算術中綴表示式求值(棧實現)
問題描述 輸入由整型分量和操作符組成的中綴表示式,輸出其字尾表示式和運算的結果。整型分量 十進位制數。操作符 如輸入3 5 8 2 7,輸出 3 5 8 2 7 結果是10 輸入3 1 4 7 3 輸出 3 1 4 7 3 結果是 18.75 輸入3 4 5 5 7 4,輸出 3 4 5 5 7 4...