我們熟知的中綴表示式在電腦中計算時應轉化為字尾表示式。
如果把表示式看作一棵二叉樹,則中綴表示式就是二叉樹的中序遍歷,字尾表示式就是二叉樹的後序遍歷。
下面講講如何將中綴表示式轉變為字尾表示式:
1.建立運算子棧用於運算子的儲存,運算子棧中的元素應始終保持:越往棧頂元素(即運算子)優先順序越高。
2.預處理中綴表示式:如果乙個加號或減號出現在中綴表示式的最前方或者是左括號的後面,則該符號代表正號或負號,在該符號的前面加上0。
3.順序掃瞄中綴表示式,如果當前字元為數字則直接輸出數字;如果當前字元為括號或者運算子,則進行第4步操作。
4.若當前運算子為'(',直接進棧;
若當前運算子為')',順序出棧並輸出至第乙個'(', '('也要出棧但不輸出;
若當前運算子為'+'或'-',則全部出棧(如有左括號則停止出棧)並輸出(括號不輸出),然後'+'和'-'入棧。
總而言之:若棧頂優先順序大於等於當前元素優先順序,則順序出棧至棧頂元素優先順序小於當前元素優先順序,最後當前元素入棧。
5.重複第3步,直到表示式掃瞄完畢,最後棧中元素全部出棧。
關於字尾表示式的計算:
(很簡單,放輕鬆)
1.建乙個棧儲存數字。
2.順序遍歷字尾表示式:
若當前字元為數字則進棧;
若當前字元為運算子,則位於棧頂的兩個數字出棧進行運算,運算結果入棧。
3.遍歷結束,輸出棧頂元素即為結果。
我編寫的程式輸入為中綴表示式,輸出為它對應的字尾表示式和字尾表示式的運算結果。
**注意:輸入的中綴表示式若含有括號應為英文括號'(',不能是中文括號'(' ,兩種括號不同!!!。
**如下:
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#define stacksize 250
typedef structsqstack;
void initstack(sqstack &s) //建立乙個空棧
}void change()
else
while(s1.top!=s1.base&&num>0&&*(s1.top-1)!='(')
if(e=='/')
if(e=='+')
if(e=='-')
printf("%c",e);
num--;
}*s1.top++=ch;
num++;
break;
case '-':
if((s1.top==s1.base&&flag==1)||(*(s1.top-1)=='('&&flag==1))
else
while(s1.top!=s1.base&&num>0&&*(s1.top-1)!='(')
if(e=='/')
if(e=='+')
if(e=='-')
printf("%c",e);
num--;
}*s1.top++=ch;
num++;
break;
case '*':
if(*(s1.top-1)=='*'||*(s1.top-1)=='/')
if(e=='/')
printf("%c",e);
num--;
}*s1.top++=ch;
num++;
break;
case '/':
if(*(s1.top-1)=='*'||*(s1.top-1)=='/')
if(e=='/')
printf("%c",e);
num--;
}*s1.top++=ch;
num++;
break;
case '(':
*s1.top++=ch;
num++;
flag=1;
break;
case ')':
while(*(s1.top-1)!='('&&num>0&&s1.top!=s1.base)
if(e=='/')
if(e=='+')
if(e=='-')
printf("%c",e);
num--;
}if(*(s1.top-1)=='(')
break;
default:
if(flag==1) flag=0;
printf("%c",ch);
*s2.top++=ch;
break;
} ch=getchar();
if(ch=='\n')
while(s1.top!=s1.base)
if(e=='/')
if(e=='+')
if(e=='-')
printf("%c",e);
}} if(pa==1)
printf("\n計算結果為:%d",count-48);
}void mainmenu()
int main()
執行結果如下:
資料結構 中綴表示式轉字尾表示式
話不多說上例子 1 2 3 4 5 1 2 3 4 5 中綴表示式轉字尾表示式思路分析 1.首先需要兩個棧運算子棧 s1和儲存中間結果的棧 s2 2.從左至右掃瞄中綴表示式 2.1當前為運算元,將其壓棧至s2 2.2當前為運算子 2.2.1如果s1為空或者棧頂運算子為左括號 則將此運算子直接入s1棧...
資料結構之中綴表示式轉字尾表示式
中綴表示式轉字尾表示式的基本規則 1.遇到運算元就直接輸出 2.遇到左括號就壓入棧中 3.遇到右括號就將棧中所有符號輸出且彈出 左括號只需要彈出不需要輸出 4.遇到操作符就與棧頂元素進行對比 當前操作符比棧頂操作符的優先順序大的話 就直接將當前操作符壓入棧中 當前操作符比棧頂操作符的優先順序小或者相...
資料結構之中綴表示式轉字尾表示式
對於計算機來說,字尾表示式更方便計算,但是對於我們來說,中綴表示式更方便理解。為了大家都方便,下面就聊聊如何把乙個中綴表示式借助 轉化成乙個字尾表示式。在實現轉字尾表示式時,用棧結構儲存操作符,由於中間結構不用出棧,並且如果用棧結構儲存,那麼將出棧結果逆序才是我們要的字尾表示式,所以用list儲存即...