算術表示式求值(C語言棧)

2021-10-25 10:15:28 字數 3531 閱讀 5118

題目描述:表示式計算是實現程式語言的基本問題之一,也是棧的應用的乙個典型例子。設計乙個程式,演示用運算子優先法對算數表示式求值的過程。

基本要求:以字串行的形式從終端輸入語法正確的、不含變數的整數表示式。利用教科書表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

首先,將輸入的字元分為兩種型別:運算數運算子。顧名思義,運算數就是參與運算的整數。運算子指加減乘除,左右括號以及『#』,其中『#』用於標記輸入的開始與結束,起乙個標識的作用。也就是說,使用者的輸入必須以『#』作為結束。

為實現上述程式功能,選擇棧用於儲存運算子與運算數,分別用兩個棧oprtnum來儲存。首先在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...