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