uva_327_Evaluating Simple C Expressions

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;

#define MAXSPLIT        10
#define MAXVAL          27
#define MAXN            1001

char split[MAXN][MAXSPLIT];
int val_table[MAXVAL], mark[MAXVAL], pos, idx;

void non_space(char *str)
{
        char tmp[MAXN];
        idx = 0;
        for(int i = 0; i < MAXVAL; i ++) {
                val_table[i] = i+1;
        }
        for(int i = 0; i < strlen(str); i ++) {
                if( ' ' == str[i] ) {
                        continue;
                }
                tmp[idx ++] = str[i];
        }
        tmp[idx] = '\0'; strcpy(str, tmp);
}

void split_var(const char *str)
{
        pos = 0;
        for(int i = 0; i < strlen(str); i ++) {
                if( !isalpha(str[i]) ) {
                        continue;
                }
                if( i >= 2 && (str[i-1] == str[i-2]) && ('+' == str[i-1] || '-' == str[i-1]) ) {
                        idx = 0;
                        for(int k = i-2; k <= i; k ++, idx ++) {
                                split[pos][idx] = str[k];
                        }
                        split[pos ++][idx ++] = '\0';

                        if( i+1 < strlen(str) ) {
                                split[pos][0] = str[i+1]; split[pos ++][idx ++] = '\0';
                        }
                         continue;
                }
                if( i+2 < strlen(str) && (str[i+1] == str[i+2]) && ('+' == str[i+1] || '-' == str[i+1]) ) {
                        idx = 0;
                        for(int k = i; k <= i+2; k ++, idx ++) {
                                split[pos][idx] = str[k];
                        }       
                        split[pos ++][idx ++] = '\0';

                        if( i+3 < strlen(str) ) {
                                split[pos][0] = str[i+3]; split[pos ++][idx ++] = '\0';
                        }
                        continue;
                }
                split[pos][0] = str[i]; split[pos ++][1] = '\0';
                if( i+1 < strlen(str) ) {
                        split[pos][0] = str[i+1]; split[pos ++][1] = '\0';
                }
        }
}

int get_expression(const int &index)
{
        int rst;
        if( strlen(split[index]) > 1 && isalpha(split[index][0]) ) {
                rst = val_table[ split[index][0]-'a' ];
                val_table[ split[index][0]-'a' ] = ('+' == split[index][1])? rst+1 : rst-1;
        }
        if( strlen(split[index]) > 1 && !isalpha(split[index][0]) ) {
                rst = val_table[ split[index][2]-'a' ];
                rst = val_table[ split[index][2]-'a' ] = ('+' == split[index][1])? rst+1 : rst-1;
        }
        else if( 1 == strlen(split[index]) ) {
                rst = val_table[ split[index][0]-'a' ];
        }
        return rst;
}

int expression_ans(void)
{
        int ans(get_expression(0)), l_val, r_val;
        for(idx = 1; idx < pos; idx += 2) {
                r_val = get_expression(idx+1);
                ans = ('+' == split[idx][0])? ans+r_val : ans-r_val;
        }
        return ans;
}

int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
        freopen("test.in", "r", stdin);
#endif
        char str[MAXN];
        while( gets(str) > 0 ) {
                printf("Expression: %s\n", str);
                non_space(str); split_var(str);
                printf("    value = %d\n", expression_ans());
                memset(mark, 0, sizeof(mark));
                for(int i = 0; i < strlen(str); i ++) {
                        if( isalpha(str[i]) ) {
                                mark[str[i]-'a'] = 1;
                        }
                }
                for(int i = 0; i < MAXVAL; i ++) {
                        if( mark[i] ) {
                                printf("    %c = %d\n", i+'a', val_table[i]);
                        }
                }
        }
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值