uva 327

题意:计算结果,注意有二目运算符,并输出每个字符的值

#include <iostream>
#include <cstdio>
#include <cstring>
#include <deque>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 130;

vector<char>var;
deque<int>que;
char str[MAXN];
int val[26];

void Filter()   //去掉空格
{
	int pos = 0;
	for (int i = 0 ; i < strlen(str) ; i++)
		if (str[i] != ' ')
			str[pos++] = str[i];
	str[pos] = '\0';
}

bool havePrefix(int i)   //前++,--
{
	 if ((str[i-1]=='+' && str[i-2] == '+') ||( str[i-1]=='-' && str[i-2]=='-'))
		return true;
	 return false;
}

bool haveSuffix(int i)    //后++,--
{
	if ((str[i+1]=='+' && str[i+2] == '+') ||( str[i+1]=='-' && str[i+2]=='-'))
		return true;
	return false;
}

void PreProssess()     //去掉二目运算符,并储存字符值
{
	while (!que.empty())
		que.pop_back();
	var.clear();
	for (int i = 0 ; i < strlen(str) ; i++)
	{
		if (str[i] >= 'a' && str[i] <= 'z')
		{
			var.push_back(str[i]);
			if (i >= 2 && havePrefix(i))
			{
				if (str[i-1] == '+')
					val[str[i] - 'a']++;
				else  val[str[i] - 'a']--;
				int n = val[str[i]-'a'];
				que.push_back(n);
				str[i-1] = str[i-2] = ' ';
			}
			else if (i <= strlen(str)-3 && haveSuffix(i))
			{
				int n = val[str[i] - 'a'];
				que.push_back(n);
				if (str[i+1] == '+')
					val[str[i] - 'a']++;
				else	val[str[i] - 'a']--;
				str[i+1] = str[i+2] = ' ';	
			}
			else 
			{
				int n = val[str[i] - 'a'];
				que.push_back(n);
			}
		}
	}
}

int getsum()
{
	for (int i = 0 ; i < strlen(str) ; i++)
	{
		if (str[i] == '+' || str[i] == '-')
		{
			int a = que.front();
			que.pop_front();
			int b = que.front();
			que.pop_front();
			if(str[i] == '+')
				que.push_front(a+b);
			else que.push_front(a-b);
		}
	}
	return que.front();
}

void solve()
{
	for (int i = 0 ; i < 26 ; i++)
		val[i] = i+1;
	Filter();
	PreProssess();
	int sum = getsum();
	printf("    value = %d\n",sum);
	sort(var.begin(),var.begin()+var.size());
	for (int i = 0 ; i < var.size() ; i++)
		printf("    %c = %d\n",var[i],val[var[i]-'a']);
}

int main()
{
	while (gets(str))
	{
		printf("Expression: %s\n",str);
		solve();
	}
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值