3-06. 表达式转换(25)
时间限制
400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式说明:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式说明:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
样例输入与输出:
序号 | 输入 | 输出 |
1 | 2+3*(7-4)+8/4 | 2 3 7 4 - * + 8 4 / + |
2 | ((2+3)*4-(8+2))/5 | 2 3 + 4 * 8 2 + - 5 / |
3 | 1314+25.5*12 | 1314 25.5 12 * + |
4 | -2*(+3) | -2 3 * |
5 | 123 | 123 |
#include<iostream>
#include<stack>
#include<string>
using namespace std;
bool isDigitOrPoint(char c)
{
if((c>='0' && c<='9')|| c=='.')
return true;
return false;
}
int main()
{
string infixExp; //前缀表达式
string postfixExp=""; //存储结果,后缀表达式
stack<char> s; //模拟栈,用来存储运算符
getline(cin,infixExp);
int strLen=infixExp.length(); //前缀表达式的长度
int i=0;
char token; //标记前缀表达式的字符
bool first=true; //是否是第一个数字
if(infixExp[0]=='+' || infixExp[0]=='-') //第一个数是整数或负数
{
postfixExp.append(1,infixExp[0]);
i++;
}
for(;i<strLen;) //循环遍历前缀表达式,进行相应的操作
{
token=infixExp[i];
switch(token) //用switch判断,思路清晰,if else太乱, 注意每个case后都要break..
{
case '(': if(i+1<strLen && ( infixExp[i+1]=='+' || infixExp[i+1]=='-') ) //括号内存在带‘+’或‘-’的正数或负数
{
string temp;
if(infixExp[i+1]=='-') //如果是负数,需要保存‘-’符号
temp.append(1,'-');
int j=i+2;
while(j<strLen && isDigitOrPoint(infixExp[j])) //获取数字部分
{
temp.append(1,infixExp[j]);
j++;
}
postfixExp=postfixExp+" "+temp;
i=j;
if(infixExp[i]==')') //如果括号内只是一个正数或负数,跳过右括号,左括号也不用入栈
i++;
else //否则
s.push(token);
}
else
{
s.push(token);
i++;
}
break;
case ')': while(s.size()!=0) //不断弹出,栈顶元素,直到遇到左括号
{
char op=s.top();
s.pop(); //删除栈顶元素
if(op=='(')
break;
else
{
postfixExp.append(1,' ');
postfixExp.append(1,op);
}
}
i++;
break;
case '+': case '-':case '*':case '/':
while(true) //不断比较token和栈顶元素,直到token入栈
{
if(s.empty() || s.top()=='(' || ( (token=='*' || token=='/') && (s.top()=='+' || s.top()=='-') ))
{ //如果栈为空,或该运算符的优先级大于栈顶元素的优先级,入栈
s.push(token);
break;
}
else //否则,弹出栈顶元素,继续比较token与栈顶元素
{
postfixExp.append(1,' ');
postfixExp.append(1,s.top());
s.pop();
}
}
i++;
break;
default: //数字部分
string temp="";
while(i<strLen && isDigitOrPoint(infixExp[i])) //数字部分
{
temp.append(1,infixExp[i]);
i++;
}
if(first)
{
postfixExp=postfixExp+temp;
first=false;
}
else
postfixExp=postfixExp+" "+temp; //运算符和数字之间以空格分开,不包括正负号
//cout<<postfixExp<<'A'<<endl;
}//switch结束
}//for结束
//弹出栈中元素
int size=s.size();
for(i=0;i<size;i++)
{
postfixExp.append(1,' ');
postfixExp.append(1,s.top());
s.pop();
}
cout<<postfixExp<<endl;
return 0;
}