以前寫了乙個中序表示式轉後序表示式,今天發現有一部分是錯的,現在進行更正:
而關於如何將中序表示式轉為後序表示式。可以參考上面的做法,建立兩個棧s1和s2,s1儲存後序表示式的結果,s2儲存運算符號。從左到右遍歷,如果當前符號是數字則推入s1,如果當前符號是」(「推入s2,如果當前符號是」)」,將(之前的符號都彈出,推入s1;如果當前符號的優先順序大於s2的頂部,則推入棧,否則一直彈出直到當前符號的優先順序大於等於s2的頂部。最後把s2的所有符號都推入s1。這裡有一些錯誤,如果當前棧頂計算符號的優先順序大於等於的當前計算符號,則彈出進行計算,直到棧為空或棧頂的計算符號小於當前計算符號上次沒有注意這一點,所以有一點錯誤。現在進行更正。更正後的**如下:
相關問題描述可以參見
不過這裡我進行了改進可以計算加減乘除。
**如下:
class solution
else
} else
if (op1 == '+' || op1 == '-')
else
} return
0;
}int calnumber(char op, int num1, int num2)
else
if (op == '-')
else
if (op == '*')
else
if (op == '/')
return -1;
}int calculate(string s)
stack
num;
stack
op;
int i = 0;
while (i < s.size())
if (s[i] == '(')
else
if (s[i] == ')')
op.pop();
i++;
}else
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
op.push(s[i]);
i++;
}else
while (i < s.size() && s[i] >= '0' && s[i] <= '9')
num.push(n);}}
while (!op.empty())
return num.top();
}};
中序表示式轉後序表示式
演算法的思想是這樣的 演算法分為兩個棧,乙個opstack為操作符棧,另一numstack為運算元棧,隨著程式執行運算元棧中里也會有操作符,這是因為小運算元和操作符化作了更大的運算元。如果需要求值,就會將運算元計算出結果,而由於此演算法只是求表示式,所以就保留了操作符。每一次彈出棧時都會涉及到操作符...
棧的應用 中序表示式轉後序表示式
infix a b c d e f g postfix abc de f g 有以下四種情況 運算元 直接輸出 操作符 將棧頂輸出,直到棧頂優先順序小於該操作符,最後把該操作符壓入棧 入棧 將棧中在 之後的操作符全部輸出 include include include include using n...
前序表示式 中序表示式 後序表示式
執行完成後,先輸出佇列內容,在輸出棧內容,最終結果即是後序表示式 先序表示式 後序表示式 public string infixtopostfix string elements if s.equals continue 碰到 或 運算子 if s.equals s.equals while sta...