關於表示式求值這個演算法:這個演算法算是比較基本的演算法了,但是應用面也特別廣,在寫之前查閱了很多資料看了很多前輩寫的一些經驗確實學到了很多,過程也比較曲折。一開始先是對幾個運算子的優先順序問題感到頭疼。後來又進一步了解到了表示式的轉換問題———中綴表示式轉換為字尾表示式。因為字尾表示式在計算機計算的時候會比較方便,儘管中綴表示式比較適合人的思維。
下面是摘抄的一些方法:
首先建立棧並置空,然後依次檢查中綴表示式每個字元,不同字元按不同情況處理: (1).若是運算元,就直接將存入字串exp中。 (2).若是『(』則將其壓入棧中。
(3).若是『)』則依次彈棧並存入字串exp中,直到遇到取出和它匹配的『(』為止,『(』出棧丟棄。
(4).若是操作符,如果棧空或者該操作符的優先順序大於棧頂操作符則將其放入到棧中。如果該操作符的優先順序小於等於棧頂操作符則彈出棧中的操作符存入字串exp中,直到該操作符的優先順序大於棧頂操作符或棧空,然後將該操作符入棧。
當讀到了中綴式的末尾時,如果棧非空則將棧中所有元素依次彈出存入字串exp中,最後見『\0』存入exp中,則exp中儲存的就是字尾表示式。
下面是我寫的原始碼:
#include
#include
#include
#include
#define max 100
struct stack;
int initstack(stack* s)
int stackfull(stack* s)
int stackempty(stack*s)
void push(stack* s,char c)
void popstack(stack*s,char c)
char gettop(stack*s,char c)
else
}int setpriority(char e)
return i;
}void transform(char h,char num)
else if(e=='+'||'-'||'*'||'/'||'('||')')while(!gettop(optr,f)=='('); // 採用do while而不是while是因為這樣可以先執行迴圈體
popstack(optr,f);
} else if(setpriority(e)>=setpriority(optr->h[optr->top]))
else if(setpriority(e)<=setpriority(optr->h[optr->top]))
} ++i;
e=h[i];}}
int main()
因為主要是想熟悉棧的應用,所以就沒有標準輸入。
在寫的過程中遇到了一些問題:
1、字元的運算 。因為在一開始考慮資料結構的時候確實遇到了這個問題,乙個正常的表示式中是存在字元型和整型兩種型別的。但是當我將它放入乙個字元陣列然後再單獨取出運算的時候,發現字元也可以進行四則運算(以%d形式輸出)
2、sizeof()。 在initstack()函式中sizeof(somestruct) 的時候發現乙個很奇怪的問題,可能我現在還沒有學到這一塊知識。在網上搜尋的時候才知道是關於 記憶體對齊 的內容。
3、對於運算子優先順序的設定問題。這個問題也是奇葩,一開始我自己想的確實頭疼,因為幾個字元之間的大小對比因為不知道他們的大小也不好直接equal ,後來通過switch(i)設定大小才通過。
4、else if 。 如果else if 過多的話 不妨用switch試試
5、當時是stack的熟悉和運用了
棧應用 表示式求值
include stdafx.h include using namespace std const int explenght 20 const int stack init size 20 const int stack incrment 10 templateclass stack stack...
棧應用 表示式求值
include include define length 100 初始分配棧的長度 define add len 10 棧長增量 typedef struct 定義字元棧 sqstack void initstack sqstack s 初始化乙個棧 void push sqstack s,int...
表示式求值 棧的應用
表示式求值 西西設計的機械人卡多掌握了加減法運算以後,最近又學會了一些簡單的函式求值,比如,它 知道函式min 20,23 的值是20 add 10,98 的值是108等等。經過訓練,西西設計的機械人卡多 甚至會計算一種巢狀的更複雜的表示式。假設表示式可以簡單定義為 1.乙個正的十進位制數 x 是乙...