算式转移:滴滴2019

 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

/*

6
1 + 3 + 2 + -4 * -5 + 1


9
1 + 3 + 2 + -4 * -5 + 1 + 2 - 1 - -1

9
1 + 3 + 2 + -4 * -5 / 1 + 2 - 1 - -1

9
1 + 3 + 2 + -4 * -5 / 2 / 1 - 1 - -1


4
2 + 1 - 2 - 1

4
2 + 1 * 2 - 1

1
2

2
2 + 1

*/

int main()
{
	int n;
	cin >> n;
	vector<int> nums(n);
	string s = "+";           //前面一个+
	for(int i=0; i<n; i++)
	{
		cin >> nums[i];       //读入数字
		if(i<n-1)
		{
			char c;
			cin >> c;         //读入符号
			s += c;        
		}
	}
	//最后添加一个和最后一个字符不一样的符号,这样最后一个数字串才能排序,因为排序是遇到不一样的符号才排序
	if(s[n-1] == '-')
		s += '+';                 //后面一个-
	else
		s += '-';
	//cout << s << endl;
		
	
	//只有一个数字的情况
	if(n == 1)
	{
		cout << nums[0];
		return 0;
	}
	
	
	//nums[i]的前面一个符号是s[i]          0 - n-1
	//nums[i]的后面一个符号是s[i+1]          1 - n
	//now代表当前待排序数字序列的符号,当当前数字nums[i]后面的符号与now不一样时,
	//执行(1)设置right,(2)排序[left, right],(3)更新 left、now。
	
	//前一个符号
	char now = '+';
	int left = 0;
	int right = 0;
	bool sort_flag = 0;
	
	for(int i=0; i<=n-1; i++)
	{
		// '+' 序列排序条件
		if(now == '+' && s[i+1] == '-')
		{
			right = i;
			sort_flag = 1;
		}
		else if(now == '+' && (s[i+1] == '*' || s[i+1] == '/'))
		{
			right = i-1;
			sort_flag = 1;
		}
		
		// '-' 序列排序条件
		else if(now == '-' && s[i+1] == '+')
		{
			right = i;
			sort_flag = 1;
		}
		else if(now == '-' && (s[i+1] == '*' || s[i+1] == '/'))
		{
			right = i-1;
			sort_flag = 1;
		}
		
		
		// '*' 序列排序条件
		else if(now == '*' && (s[i+1] == '/' || s[i+1] == '+' || s[i+1] == '-'))
		{
			right = i;
			sort_flag = 1;
		}
		
		
		// '/' 序列排序条件
		else if(now == '/' && (s[i+1] == '*' || s[i+1] == '+' || s[i+1] == '-'))
		{
			right = i;
			sort_flag = 1;
		}
		
		//是否排序
		if(sort_flag)
		{
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = s[i+1];
			
			sort_flag = 0;
		}
	}
	
	
	//输出
	for(int i=0; i<n; i++)
	{
		cout << nums[i];
		if(i < n-1)
		{
			cout << ' ';
			cout << s[i+1];
			cout << ' ';
		}
	}
	
	return 0;
}





/*
int main()
{
	int n;
	cin >> n;
	vector<int> nums(n);
	string s = "+";           //前面一个+
	for(int i=0; i<n; i++)
	{
		cin >> nums[i];       //读入数字
		if(i<n-1)
		{
			char c;
			cin >> c;         //读入符号
			s += c;        
		}
	}
	//最后添加一个和最后一个字符不一样的符号,这样最后一个数字串才能排序,因为排序是遇到不一样的符号才排序
	if(s[n-1] == '-')
		s += '+';                 //后面一个-
	else
		s += '-';
	//cout << s << endl;
		
	
	//只有一个数字的情况
	if(n == 1)
	{
		cout << nums[0];
		return 0;
	}
	
	
	//nums[i]的前面一个符号是s[i]          0 - n-1
	//nums[i]的后面一个符号是s[i+1]        0 -     n
	//now代表当前待排序数字序列的符号,当当前数字nums[i]后面的符号与now不一样时,
	//执行(1)设置right,(2)排序[left, right],(3)更新 left、now。
	
	//前一个符号
	char now = '+';
	int left = 0;
	int right = 0;
	for(int i=0; i<=n-1; i++)
	{
		// '+' 序列待排序
		if(now == '+' && s[i+1] == '-')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right + 1;
			now = s[i+1];
		}
		else if(now == '+' && (s[i+1] == '*' || s[i+1] == '/'))
		{
			right = i-1;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = s[i+1];
		}
		
		// '-' 序列待排序
		else if(now == '-' && s[i+1] == '+')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right + 1;
			right = left;
			now = s[i+1];
		}
		else if(now == '-' && (s[i+1] == '*' || s[i+1] == '/'))
		{
			right = i-1;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = s[i+1];
		}
		
		
		// '*' 序列待排序
		else if(now == '*' && (s[i+1] == '/' || s[i+1] == '+' || s[i+1] == '-'))
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = s[i+1];
		}
		
		
		// '/' 序列待排序
		else if(now == '/' && (s[i+1] == '*' || s[i+1] == '+' || s[i+1] == '-'))
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = s[i+1];
		}
	}
	
	
	//输出
	for(int i=0; i<n; i++)
	{
		cout << nums[i];
		if(i < n-1)
		{
			cout << ' ';
			cout << s[i+1];
			cout << ' ';
		}
	}
	
	return 0;
}
*/


/*
int main()
{
	int n;
	cin >> n;
	vector<int> nums(n);
	string s = "+";           //前面一个+
	for(int i=0; i<n; i++)
	{
		cin >> nums[i];       //读入数字
		if(i<n-1)
		{
			char c;
			cin >> c;         //读入符号
			s += c;        
		}
	}
	//最后添加一个和最后一个字符不一样的符号,这样最后一个数字串才能排序,因为排序是遇到不一样的符号才排序
	if(s[n-1] == '-')
		s += '+';                 //后面一个+
	else
		s += '-';
	//cout << s << endl;
		
	
	//只有一个数字的情况
	if(n == 1)
	{
		cout << nums[0];
		return 0;
	}
	
	
	//nums[i]的前面一个符号是s[i]          0 - n-1
	//nums[i]的后面一个符号是s[i+1]        0 -     n
	
	//前一个符号
	char now = '+';
	int left = 0;
	int right = 0;
	for(int i=0; i<=n-1; i++)
	{
		// '+' 序列
		if(now == '+' && s[i+1] == '+')
		{
			right = i;
		}
		else if(now == '+' && s[i+1] == '-')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right + 1;
			right = left;
			now = '-';
		}
		else if(now == '+' && s[i+1] == '*')
		{
			right = i-1;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '*';
		}
		else if(now == '+' && s[i+1] == '/')
		{
			right = i-1;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '/';
		}
		
		// '-' 序列
		else if(now == '-' && s[i+1] == '-')
		{
			right = i;
		}
		else if(now == '-' && s[i+1] == '+')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right + 1;
			right = left;
			now = '+';
		}
		else if(now == '-' && s[i+1] == '*')
		{
			right = i-1;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '*';
		}
		else if(now == '-' && s[i+1] == '/')
		{
			right = i-1;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '/';
		}
		
		
		// '*' 序列
		else if(now == '*' && s[i+1] == '*')
		{
			right = i;
		}
		else if(now == '*' && s[i+1] == '/')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '/';
		}
		else if(now == '*' && s[i+1] == '+')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '+';
		}
		else if(now == '*' && s[i+1] == '-')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '-';
		}
		
		// '/' 序列
		else if(now == '/' && s[i+1] == '/')
		{
			right = i;
		}
		else if(now == '/' && s[i+1] == '*')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '*';
		}
		else if(now == '/' && s[i+1] == '+')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '+';
		}
		else if(now == '/' && s[i+1] == '-')
		{
			right = i;
			sort(nums.begin()+left, nums.begin()+right+1);
			left = right+1;
			now = '-';
		}
	}
	
	
	//输出
	for(int i=0; i<n; i++)
	{
		cout << nums[i];
		if(i < n-1)
		{
			cout << ' ';
			cout << s[i+1];
			cout << ' ';
		}
	}
	
	return 0;
}
*/

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值