蓝桥杯的训练-表达式计算


#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <cmath>
#include <queue>

using namespace std;
char prior[7][7] =
{
    '>', '>', '<', '<', '<', '>', '>',
    '>', '>', '<', '<', '<', '>', '>',
    '>', '>', '>', '>', '<', '>', '>',
    '>', '>', '>', '>', '<', '>', '>',
    '<', '<', '<', '<', '<', '=', ' ',
    '>', '>', '>', '>', ' ', '>', '>',
    '<', '<', '<', '<', '<', ' ', '='
};
char OPSET[7] = { '+', '-', '*', '/', '(', ')', '\n' };

int In(char c)
{
    int i;
    for (i = 0; i < 7; i++)
        if (OPSET[i] == c) return true;
    return false;
}

int GetPos(char c)
{
    int i;
    for (i = 0; i < 7; i++)
        if (OPSET[i] == c) return i;
    return false;
}

int precede(char a, char b)
{
    return prior[GetPos(a)][GetPos(b)];
}

int Operate(int a, char theta, int b)
{
    switch (theta)
    {
    case '+':
        return a + b;
    case '-':
        return a - b;
    case '*':
        return a * b;
    case '/':
        return a / b;
    }
    return 0;
}

int main()
{
    stack<char> OPTR;
    stack<int> OPND;
    int a, b;
    char theta, c;
    OPTR.push('\n');
    c = getchar();
    while (c != '\n' || OPTR.top() != '\n')
        if (!In(c))
        {
            int sum = 0, i = 0;
            char s[20];
            s[i++]=c;
            c = getchar();
            while(!In(c))
                 s[i++]=c,c = getchar();
            OPND.push(atof(s));
        }
        else
            switch (precede(OPTR.top(), c))
            {
            case '<':
                OPTR.push(c);
                c = getchar();
                break;
            case '=':
                OPTR.pop();
                c = getchar();
                break;
            case '>':
                theta = OPTR.top();
                OPTR.pop();
                b=OPND.top();
                OPND.pop();
                a=OPND.top();
                OPND.pop();
                OPND.push(Operate(a, theta, b));
                break;
            }
    printf("%d\n",OPND.top());
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值