表示式求值

2021-10-03 17:44:44 字數 1835 閱讀 7584

表示式求值是高階語言編譯中的乙個基本問題,是棧的典型應用例項。任何乙個表示式都是由運算物件,運算子和界限符組成的。運算物件既可以是常數,也可以是被說明為變數或常量的識別符號;運算子可以分為算術運算子,關係運算子和邏輯運算子三類;基本界限符有括號和表示式結束符等。

演算法思想

1.規定運算子的優先順序表。

2.設定兩個棧,)ovs(運算數棧),optr(運算子棧)。

3,自左向右掃瞄,進行如下處理。

若遇到運算數則進入ovs棧,若遇到運算子則與optr棧的棧頂運算子進行有限比較:

如果當前運算子優先順序大於optr棧頂運算子優先順序,則當前運算子進optr棧、

如果當前運算子優先順序小於等於optr棧頂運算子優先順序,則optr退棧一次,得到棧頂運算子&,連續退ovs棧兩次,得到運算數a 運算數b,對a b執行&運算,得到結果t,將t進ovs棧。

演算法描述

#include

using namespace std;

typedef

char stackelementtype;

//棧資料型別

typedef

struct stacknodelinkstacknode,

*linkstack;

//定義乙個運算子陣列集合

stackelementtype opset=

;//初始化棧

void

initstack

(linkstack &top)

//操作:進棧

bool push

(linkstack &top,stackelementtype data)

//出棧並返回出棧的值

bool pop

(linkstack &top,stackelementtype &data)

//判斷字元是不是運算子,是運算子返回1不是返回0

bool inopset

(stackelementtype a,stackelementtype b)

return0;

//沒有找到這個運算子

}//轉換 把字元型資料轉換成整形

void

getnumber

(stackelementtype &a)

//獲取棧頂的元素,不改變原來棧的資訊

stackelementtype gettop

(linkstack top)

//給運算子賦優先順序

intjudgepriority

(stackelementtype op)

return priority;

//返回對應的優先順序

}//和棧頂的運算子進行比較,結果返回》或《或=

stackelementtype compare

(stackelementtype a,stackelementtype b)

//計算兩個數的運算

intexecute

(int a,stackelementtype op,

int b)

}//無括號表示式運算

intexpevaluation()

else

switch

(compare

(ch,

gettop

(optr)))

} result =

gettop

(ovs)

;//獲取計算最後的結果

return result;

//返回結果

}//main函式,程式的入口位址

void

main()

表示式求值

程式的說明見清華大學出版社 資料結構 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 ...