3-06. 表达式转换(25)

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;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值