演算法詳解:
1、在遇到運算元時,將其追加到輸出字串postfix中,在字尾表示式中,運算元的順序與其在中綴表示式中的順序相同,中綴表示式中操作符左邊的運算元也出現在字尾表示式中的操作符的左邊。
2、使各個左括號符入棧。
3、在遇到操作符時,若棧為空,則使操作符入棧。若棧非空,則使優先順序更高(或相同)的操作符出棧,並追加到postfix中,在遇到左括號符,或優先順序更低的操作符,或棧為空時停止。然後使新操作符入棧,這樣,該步驟按優先順序和從左到右的順序給操作符排序。注意,使操作符持續出棧,直到遇到的操作符的優先順序比中綴表示式的當前操作符的優先順序低為止,在優先順序相同時,不停,因為從左到右的關聯規則認為:在優先順序相同的情況下,先應用最左邊的操作符,而該操作符已在棧上。
4、在遇到右括號時,使操作符出棧,並追加到postfix尾,知道遇到左括號為止,原因是:在一對小括號內,優先順序和從左到右的關聯順序確定操作符的順序,第三步已經按照這些規則確定了操作符的順序。
5、在到達字串尾時,將棧中的其他內容追加到postfix中。
關於操作符的優先順序問題,我採用了一位網友的方法,製作乙個優先順序的表,然後根據表中值的大小(1或0或-1)來判斷兩個操作符的優先級別。
#include#include#include#include#includeusing namespace std; void infix2postfix(const string &infix,string & postfix); bool isparenleft(char ch); bool isparenright(char ch); bool isoperand(char ch); bool isoperator(char ch); bool priority(char ch1,char ch2); typedef pairpair; mapopemap; int table[4][4]=,,,}; int main() bool isparenleft(char ch) bool isparenright(char ch) '||ch==')'); } bool isoperand(char ch) bool isoperator(char ch) void infix2postfix(const string &infix,string & postfix) { int size=infix.size(); char ch; stacks; for(int i=0;i
棧的應用之中綴轉字尾
include stdio.h include stdlib.h include string.h include linkstack.h int isnumber char c int isoperator char c int isleft char c int isright char c c...
基於棧的應用之中綴轉字尾
include include include include includeusing namespace std void infix2postfix const string infix,string postfix bool isparenleft char ch bool isparenr...
棧的應用之中綴表示式轉字尾表示式
由於中綴表示式有括號的存在,其運算次序比較複雜,直接分析有些難度。先考慮不帶括號的中綴表示式的轉換。由於運算符號具有不同的優先順序,當前的運算子不能直接放在運算元的後面,需要考慮下乙個運算子的優先順序。對比三個不同的中綴表示式轉換為字尾表示式的結果 可以發現 1.字尾表示式數字的出現順序和中綴表示式...