60行c++簡單實現中綴表示式轉字尾
阿新 • • 發佈:2018-11-11
中綴表示式轉字尾表示式演算法
使用棧進行輔助
對於符號±/(),定義為/優先順序為2,’(’(左括號)優先順序為3,右括號’)'優先順序最低為0
對於一個表示式
如果當前字元為數字: 輸出到輸出佇列中; 否則當前字元是運算子號或者括號時候: while 當前優先順序大於棧頂優先順序並且棧不空: 棧頂元素出棧加入到輸出佇列中; 將元素壓入棧內; while 當前棧非空: 出棧返回棧頂元素;
對於左右括號問題
把左括號定義為 壓入前是最高的優先順序 壓入後是最低優先順序
這樣一旦遇到左括號一定能被壓入,並且壓入後等級是最低的
定義右括號為第二低低的優先順序 這樣它就可以 一直pop棧元素
然後等遇到左括號 (左括號這個時候是最低的優先順序)的時候
pop左括號
原始碼
#include <iostream>
#include <stack>
#include <cctype>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> ss;
ss['+'] = 1;
ss['-'] = 1;
ss['*'] = 2;
ss['/'] = 2;
stack<char> s;
string express;
while (cin >> express)
{
for (int i = 0; i < express.length(); i++)
{
if (isalpha(express[i]))
{
cout << express[i] << " ";
}
else if (express[i] == '(')
{
s.push( express[i]);
}
else if (express[i] == ')')
{
while (s.top() != '(')
{
cout << s.top() << " ";
s.pop();
}
s.pop();
}
//*/優先順序高因此棧的棧頂是優先順序高的
else
{
//cout << express[i];
// 當前棧頂的元素優先順序大於當前零時字元
while (!s.empty() && ss[s.top()] >= ss[express[i]])
{
cout << s.top() << " ";
s.pop();
}
s.push(express[i]);
}
}
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
}
system("pause");
return 0;
}