UVA327

题目很简单就是a代表1,b代表2,去计算式子的值,如果是i++则计算结果的时候不用加,输出数字的时候要加,++i则计算输出都要加1。。

看到题目就想不明白,为什么是树,我采用的是直接模拟。。

做了好久,发现直接模拟情况真的好多。。。默默的流泪写了又臭又长又难看的一段代码,因为几种情况没考虑wa了几次,还好最后A了,不然换别的方法重新写会吐的。。。。。


#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
using namespace std;

int main () {
	map<string, int>  m;
	queue<int> finalnum;
	queue<char> finalchar;
	int ma[200];
	for (int i = 97 ; i <= 123 ;i++ )
	ma[i] = i -96;
	string str2;
	while(getline (cin ,str2)) {
		string str;
		int num;
		for (int i = 0 ;i < str2.size() ;i++ ) {
			if (str2[i] != ' ')
				str += str2[i];
		}
		int flag;
		for (int i = 0; i < str.size() ;i++) {
			flag = 0;
			if (str[i] >= 'a' && str[i] <= 'z') {
				num = ma[str[i]];
				if (i < str.size() - 2 &&str[i + 1] == '+' && str[i + 2] == '+' && str[i + 3] != '+'){
					num = num;
					string temp = "";
					temp += str[i];
					m.insert(pair<string,int>(temp,num + 1));
					flag = 1;
				}
				if (i < str.size() - 2 && str[i + 1] == '-' && str[i + 2] == '-' && str[i + 3] != '-'){
					num = num;
					string temp = "";
					temp += str[i];
					m.insert(pair<string,int>(temp,num - 1));
					flag = 1;
				}
				if (flag == 0) {
					string temp ="";
					temp += str[i];
					m.insert(pair<string,int>(temp,num));
				}
				finalnum.push(num);
			}
			if (str[i] == '+' || str[i] == '-') {
				if(i == 0 && str[0] == '+' && str[1] == '+') {
					num = ma[str[i + 2]] + 1;
					string temp = "";
					temp += str[i + 2];
					m.insert(pair<string,int>(temp,num));
					finalnum.push(num);
					flag = 1;
				}
				if(i == 0 && str[0] == '-' && str[1] == '-') {
					num = ma[str[i + 2]] - 1;
					string temp = "";
					temp += str[i + 2];
					m.insert(pair<string,int>(temp,num));
					finalnum.push(num);
					flag = 1;
				}
				if (i < str.size() - 2 && flag != 1&& str[i] == '+' && str[i - 1]== '-' && str[i + 1] == '+' && str[i + 2] >= 'a' &&str[i + 2] <='z') {
					num = ma[str[i + 2]] + 1;
					string temp = "";
					temp += str[i + 2];
					m.insert(pair<string,int>(temp,num));
					finalnum.push(num);
					flag = 1;
				}
				if (i < str.size() - 2 &&flag !=1 && str[i] == '-' &&str[i - 1] == '+' && str[i + 1] == '-' && str[i + 2] >= 'a' && str[2] <= 'z') {	
					num = ma[str[i + 2]] - 1;
					string temp = "";
					temp += str[i + 2];
					m.insert(pair<string,int>(temp,num));
					finalnum.push(num);
					flag = 1;
				}
				if (flag ==  0) {
					finalchar.push(str[i]);
				}
			}
			if (flag == 1) {
				i += 2;
			}

		}
		int k;
		k = finalnum.front();
		finalnum.pop();
		while (!finalnum.empty()) {
			if (finalchar.front() == '+')
				k += finalnum.front();
			else
				k -= finalnum.front();
			finalnum.pop();
			finalchar.pop();
		}
		cout<<"Expression: "<< str2 <<endl;
		cout<<"    value = " << k <<endl;
		map<string ,int >::iterator it = m.begin();
		for (;it != m.end();it++) {	
			cout <<"    "<< it -> first <<" = "<<it -> second <<endl;
		}
		m.clear();
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值