• STL栈的应用之表达式求值


    
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<stack>
    
    using namespace std;
    
    /*************
     *计算
    *************/
    
    int operate(int a, char op, int b ){
        if(op == '+') return a+b;
        else if(op == '-') return a-b;
        else if(op == '*') return a*b;
        else if(op == '/') return a/b;
    }
    
    /**************
     *比較优先级
    **************/
    
    char precede(char a, char b){
        if(a=='+' || a=='-'){
            if(b=='*' || b=='/' || b=='(') return '<';
            else if(b==')' || b=='+'
                    || b=='-' || b=='#') return '>';
        }
    
        else if(a=='*' || a=='/'){
            if(b=='(') return '<';
            else if(b=='+' || b=='-' || b=='*'
                    || b=='/' || b==')' || b=='#') return '>';
        }
    
        else if(a=='('){
            if(b=='+' || b=='-' || b=='*'
               || b=='/' || b=='(') return '<';
            else if(b==')') return '=';
        }
    
        else if(a==')'){
            if(b=='+' || b=='-' || b=='*'
               || b=='/' || b=='#' || b==')') return '>';
        }
    
        else if(a=='#'){
            if(b=='+' || b=='-' || b=='*' ||
               b=='/' || b=='#' || b=='(') return '<';
        }
    }
    
    /**********************
     *推断是否为数字字符
    **********************/
    
    bool judge(char a){
        if(a>='0' && a<='9')return true;
        else return false;
    }
    
    /***************
     *Main函数
    ***************/
    
    int main()
    {
        stack<int>op_n;
        stack<char>op_s;
        char str, ans;
        int num = 0;
        bool flag = false;
        op_s.push('#');
        cin >> str;
    
        while(str!='#' || op_s.top()!='#'){
            if(judge(str)){
                flag = true;
                num = num*10 + (str-'0');   /*处理多位数数据*/
                cin >> str;
            }else{
                if(flag){
                    flag = false;
                    op_n.push(num);
                    num = 0;
                }
                ans = precede(op_s.top(), str);
                if(ans == '<'){
                    op_s.push(str);
                    cin>>str;
                }
    
                if(ans == '='){
                    op_s.pop();
                    cin >> str;
                }
    
                if(ans == '>'){
                    int a;int b;char c;
                    b = op_n.top();op_n.pop();
                    a = op_n.top();op_n.pop();
                    c = op_s.top();op_s.pop();
                    cout << a << ' ' << c
                    << ' ' << b << endl;
                    op_n.push( operate(a, c, b) );
                }
            }
        }
        cout << op_n.top() << endl;
        return 0;
    }
    



     

  • 相关阅读:
    Spring Boot 中使用 @Transactional 注解配置事务管理
    springboot 整合Swagger2的使用
    Vue的参数请求与传递
    SpringMVC的全局异常处理
    SpringBoot集成MyBatis的Bean配置方式
    Springboot整合通用mapper
    个人作业——软件工程实践总结作业
    团队作业第二次—项目选题报告(追光的人)
    结对第二次—文献摘要热词统计及进阶需求
    结对第一次—原型设计(文献摘要热词统计)
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6762091.html
Copyright © 2020-2023  润新知