題目描述
輸入乙個中綴表示式,程式設計輸出其字尾表示式,要求輸出的字尾表示式的運算次序與輸入的中綴表示式的運算次序相一致。為簡單起見,假設輸入的中綴表示式由+(加)、-(減)、×(乘)、/(除)四個運算符號以及左右圓括號和英文本母組成,其中算術運算子遵守先乘除後加減的運算規則。假設輸入的中綴表示式長度不超過200個字元,且都是正確的,即沒有語法錯誤,並且凡出現括號其內部一定有表示式,即內部至少有乙個運算符號。
輸入只有一行,為中綴表示式 輸出
只有一行,為轉換後的字尾表示式
樣例輸入
x+a*
(y-b)
-z/f
樣例輸出
xayb-
*+zf/
-
解題思路:
建立兩個棧,資料總棧與運算子棧,乙個儲存全部資料,乙個作為中間過程需求儲存運算子。
**如下:
#include
/*符號棧*/
struct symbol
symbol;
/*資料總棧*/
struct number
number;
//棧的初始化
void
init()
//將運算子替換成數字以比較優先順序
/*優先順序:【'*'='/'】 > 【'+'='-'】 > 【'('】 */
intreplace
(char a)
}//優先順序的比較
/* s為符號棧的棧頂運算子,e為待定運算子
若sint
compare
(char s,
char e)
//字尾表示式轉換
void
reversepolish
(char ex)
else
if(ex[i]
=='('
)/*若ex[i]為')',則將運算子棧棧頂運算子出棧 新增到資料總棧,直到運算子棧棧頂為')'*/
if(ex[i]
==')'
) symbol.top--
;continue;}
/*比較運算子棧頂運算子symbol.s[symbol.top],與待定運算子ex[i]的優先順序*/if(
compare
(symbol.s[symbol.top]
, ex[i]
)) symbol.s[
++symbol.top]
= ex[i]
;/*若成立,直接將ex[i]新增到符號棧棧頂*/
/*不成立,先將運算子棧頂運算子出棧,新增到資料總棧,
然後將ex[i]入運算子棧,再與前一位運算子比較,迴圈上述操作,
直到運算子棧頂運算子優先順序大於它的前一位運算子*/
else}}
}/*將運算子棧剩餘的運算子依次出棧並新增到資料總棧*/
while
(symbol.top !=-1
)}//輸出結果(字尾表示式)
void
printlist()
}int
main()
中綴表示式轉換字尾表示式
中綴表示式是最自然 最易被人類理解的表達方式,但是計算機處理起來並不顯得方便,這時,字尾表示式就發揮作用了 例如 計算表示式 a b c d 的值,程式裡需要不斷的判斷運算子的優先順序,先計算括號裡的子表示式 假如我們將上述表示式轉換為字尾表示式 a b c d 你會發現現在是不需要括號了 這時我們...
字尾表示式 中綴到字尾表示式
輸入空格跳出迴圈 while k getchar n 字尾表示式 此 僅限於0 9內的加減乘除 include include include define long 10 using namespace std typedef struct stack qstack void init qstac...
中綴字尾表示式的轉換
它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...