大学霸英子又来了,这次她想计算一个很长的表达式的值:3+5/7-67-(324-72)....
为了偷懒,她想利用siri,于是有了下面的一段对话:
“siri,请告诉我3+5/7-67-(324-72)....的结果”?
“这对我太难了,请先转成后缀表达式”!
......
于是,英子来请教你,怎么把中缀表达式转化成后缀表达式
输入格式:
只有一行数据,中缀表达式的字符串,含有正整数,操作符号:+,-,*,/,(,)。
输出格式:
后缀表达式,每个操作数和操作符后面请输入一个“,”作为分割
限制:
空间限制:128MByte
时间限制:1秒
样例:
输入:
2*(5-2)+3
输出:
2,5,2,-,*,3,+
算法思想
中缀转后缀转换过程需要用到栈,具体过程如下:
从左到右扫描字符串
1)如果遇到操作数,我们就直接将其输出 。
2)如果遇到操作符,当栈为空直接进栈,不为空,判断栈顶元素操作符优先级是否比当前操作符小,小的话直接把当前操作符进栈,不小的话栈顶元素出栈输出,直到栈顶元素操作符优先级比当前操作符小
3)遇到左括号时我们也将其放入栈中。
4)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号也要弹出
代码如下
#include <bits/stdc++.h>
using namespace std;
int flag = 1;
int main()
{
char eee[1000];
map<char,int> www;
queue<char> q;
stack<char> s;
www['*'] = 2;
www['/'] = 2;
www['+'] = 1;
www['-'] = 1;
cin >> eee;
int len = strlen(eee);
for (int i = 0; i <len ; )
{
if(eee[i] >= '0' && eee[i] <= '9')
{
int sum = 0;
while(eee[i] >= '0' && eee[i] <= '9')
{
sum = sum * 10 + eee[i] - '0';
i++;
}
if(flag)
{
flag = 0;
}
else
{
cout<<",";
}
cout<<sum;
}
else
{
if(eee[i] == '(')
{
s.push(eee[i]);
}
else if(eee[i] == ')')
{
while(s.top()!='(')
{
if(flag)
{
flag = 0;
}
else
{
cout<<",";
}
cout<<s.top();
s.pop();
}
s.pop();
}
else
{
while(s.size() && www[s.top()] >= www[eee[i]])
{
if(flag)
{
flag = 0;
}
else
{
cout<<",";
}
cout<<s.top();s.pop();
}
s.push(eee[i]);
}
i++;
}
}
while (s.size())
{
if(flag)
{
flag = 0;
}
else
{
cout<<",";
}
cout<<s.top();
s.pop();
}
return 0;
}