表达式转换

大学霸英子又来了,这次她想计算一个很长的表达式的值: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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值