中綴表示式轉換為字尾表示式(思路)
1.建立棧
2.從左向右順序獲取中綴表示式
a.數字直接輸出
b.運算子
情況一:遇到左括號直接入棧,遇到右括號將棧中左括號之**棧的運算子全部彈棧輸出,同時左括號出棧但是不輸出。
情況二:遇到乘號和除號直接入棧,直到遇到優先順序比它更低的運算子,依次彈棧。
情況三:遇到加號和減號,如果此時棧空,則直接入棧,否則,將棧中優先順序高的運算子依次彈棧(注意:加號和減號屬於同乙個優先順序,所以也依次彈棧)直到棧空或則遇到左括號為止,停止彈棧。(因為左括號要匹配右括號時才彈出)。
情況四:獲取完後,將棧中剩餘的運算符號依次彈棧輸出
例:比如將:2*(9+6/3-5)+4轉化為字尾表示式 2 9 6 3 / +5 - * 4 +
轉換演算法**如下:
/*中綴轉字尾函式*/
void change(sqstack *s,elemtype str)
} /*加減運算子優先順序最低,如果棧頂元素為空則直接入棧,否則將棧中儲存
的運算子全部彈棧,如果遇到左括號則停止,將彈出的左括號從新壓棧,因為左
括號要和又括號匹配時彈出,這個後面單獨討論。彈出後將優先順序低的運算子壓入棧中*/
if(str[i]=='+'||str[i]=='-')
else
else
}while( stacklength(s) && e != '(' );
pushstack(s,str[i]);
} }/*當遇到右括號是,把括號裡剩餘的運算子彈出,直到匹配到左括號為止
左括號只彈出不列印(右括號也不壓棧)*/
else if(str[i]==')') }
/*乘、除、左括號都是優先順序高的,直接壓棧*/
else if(str[i]=='*'||str[i]=='/'||str[i]=='(')
else if(str[i]=='\0')
else
i++;
} /*最後把棧中剩餘的運算子依次彈棧列印*/
while(stacklength(s))
}完整**如下:
#include
#include
#include
#include
#define initsize 20
#define increment 10
#define maxbuffer 20
#define len sizeof(elemtype)
/*棧的動態分配儲存結構*/
typedef char elemtype;
typedef structsqstack;
/*初始化棧*/
void initstack(sqstack *s)
/*壓棧操作*/
void pushstack(sqstack *s,elemtype c)
*s->top++ = c;
}/*求棧長*/
int stacklength(sqstack *s)
/*彈棧操作*/
int popstack(sqstack *s,elemtype *c)
*c=*--s->top;
return 1;
}/*中綴轉字尾函式*/
void change(sqstack *s,elemtype str)
} /*加減運算子優先順序最低,如果棧頂元素為空則直接入棧,否則將棧中儲存
的運算子全部彈棧,如果遇到左括號則停止,將彈出的左括號從新壓棧,因為左
括號要和又括號匹配時彈出,這個後面單獨討論。彈出後將優先順序低的運算子壓入棧中*/
if(str[i]=='+'||str[i]=='-')
else
else
}while( stacklength(s) && e != '(' );
pushstack(s,str[i]);
} }/*當遇到右括號是,把括號裡剩餘的運算子彈出,直到匹配到左括號為止
左括號只彈出不列印(右括號也不壓棧)*/
els程式設計客棧e if(str[i]==')') }
/*乘、除、左括號都是優先順序高的,直接壓棧*/
else if(str[i]=='*'||str[i]=='/'||str[i]=='(')
else ifjszkivotg(str[i]=='\0')
else
i++;
} /*最後把棧中剩餘的運算子依次彈棧列印*/
while(stacklength(s)) }
int main()
執行效果截圖如下:
如何實現將中綴表示式轉換成字尾表示式後計算值
本文標題: c語言實現中綴表示式轉換為字尾表示式
本文位址:
中綴表示式轉換為字尾表示式
今天我們課前談一談,要說點什麼好呢?最近小甲魚發現,很多魚油在學習資料結構和演算法的時候積極性已經開始有點下降了。甚至很多朋友懷疑資料結構和演算法到底有沒有用?實話說,在大廈的防震設計 消除疾病 防止水源枯竭這些實際問題中,很遺憾,資料結構和演算法幾乎起不到任何直接作用。那為什麼我們要學呢?很簡單,...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...
中綴表示式轉換為字尾表示式
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...