zoukankan      html  css  js  c++  java
  • 蓝桥杯的训练-表达式计算


    #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] = { '+', '-', '*', '/', '(', ')', '
    ' };
    
    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('
    ');
        c = getchar();
        while (c != '
    ' || OPTR.top() != '
    ')
            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
    ",OPND.top());
        return 0;
    }
    


  • 相关阅读:
    使用vs2010编译 Python SIP PyQt4
    谷歌编程指南
    【转】微策略面经相关资料
    KMP 算法
    C++ 拷贝构造函数
    虚继承 虚表 定义一个不能被继承的类
    cache的工作原理
    背包问题
    【转】C/C++ 内存对齐
    【转】 Linux/Unix 进程间通信的各种方式及其比较
  • 原文地址:https://www.cnblogs.com/chinashenkai/p/9451394.html
Copyright © 2011-2022 走看看