zoukankan      html  css  js  c++  java
  • 【足迹C++primer】表达式求值

    表达式求值

    /**
    * 功能:表达式求值(0到9)
    * 时间:2014年6月15日08:02:31
    * 作者:cutter_point
    */
    
    #include<stdlib.h>
    #include<stack>
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    stack<int> intStack;        //存放数值的栈
    stack<char> charStack;      //存放运算符
    
    string OP="+-*/()#";        //等会用finf_first_of来找出来全部的数
    string shuzhi="0123456789";
    
    //推断运算符的优先级,c1表示前面元素,c2在c1之后
    char isFirst(char c1, char c2)
    {
        char res='#';
    
        switch(c1)
        {
        case '+': case '-': //推断前面是+和-的情况
            switch(c2)
            {
            case '+': case '-': case ')': case '#':
                res='>';    //加减的优先级比他们高,碰到就让前面的出栈计算
                break;
            case '*': case '/': case '(':
                res='<';    //加减的优先级比他们低,当碰到的时候直接进栈
                break;
            }
            break;
        case '*': case '/': //推断前面是*和/的情况
            switch(c2)
            {
            case '(':
                res='<';
                break;
            default:
                res='>';
                break;
            }
            break;
        case '(':
            switch(c2)
            {
            case ')':
                res='=';
                break;
            default:
                res='<';
                break;
            }
            break;
        case ')':
            res='>';
            break;
        case '#':
            switch(c2)
            {
            case '#':
                res='=';
                break;
            default:
                res='<';
                break;
            }
            break;
        }
    
        return res;
    }
    
    //推断是否是运算符
    bool In(char c, string OP)
    {
        bool b=false;
    
        for(string::iterator it=OP.begin() ; it != OP.end() ; ++it)
        {
            if(c == *it)
            {
                b=true;
                break;
            }
    
        }
    
        return b;
    }
    
    //得到计算结果
    int countResult(int a, char opera, int b)
    {
        int res=0;
    
        switch(opera)
        {
        case '+':
            res=a+b;
            break;
        case '-':
            res=a-b;
            break;
        case '*':
            res=a*b;
            break;
        case '/':
            res=a/b;
            break;
        }
    
        return res;
    }
    
    int result(string s)
    {
        //得到算术表达式的值
    
        //首先让charStack栈的栈顶变为'#'
        charStack.push('#');
        //循环对栈进行操作
        string::iterator it=s.begin();
        while(it != s.end())
        {
            if(!In(*it, OP))
            {
                //首先把字符转化成数字
                int a=*it-'0';
                intStack.push(a);
                ++it;
            }
            else
            {
                switch(isFirst(charStack.top(), *it))
                {
                case '<':       //优先级比前面的小,那就直接进栈
                    charStack.push(*it);
                    ++it;
                    break;
                case '=':
                    charStack.pop();//弹出栈顶元素,脱括号继续循环
                    ++it;
                    break;
                case '>':       //对栈进行各种操作,退栈并将运算结果入栈
                    int b=intStack.top();   //得到前面一个数值
                    intStack.pop();         //吧栈顶的元素删除
                    int a=intStack.top();   //得到第二个数字
                    intStack.pop();         //删除栈顶元素
                    //取出运算符号
                    char opera=charStack.top(); //得到栈顶元素
                    charStack.pop();            //删除栈顶元素
    
                    //进行计算
                    intStack.push(countResult(a, opera, b));
                    break;
                }//switch
            }//else
        }//while
    
        cout<<"结果是:"<<intStack.top()<<endl;
    
        return intStack.top();
    }
    
    /*
    //找到string看是否是运算符
    bool isYunSuanFu(string s)
    {
        bool b=false;
    
        string::size_type pos=0;
    
        if(pos=s.find_first_of(OP, pos) != string::npos)
        {
            b=true;
        }
    
        return b;
    }
    */
    
    int main()
    {
        string s;
        cout<<"输入算术表达式:"<<endl;
        while(cin>>s)
        {
            cout<<"计算结果是:"<<endl;
            cout<<result(s)<<endl;
        }
    
    
    //    string::size_type pos=0;
    //    shuzhi.erase(pos,1);  删除的结果是123456789
    //    cout<<shuzhi;
    
        return 0;
    }
    
    //蛋疼调试结束:2014年6月15日11:53:01

    測试数据:
    9+8/4*(2+1)/2#

    输出结果是:
    12

    大笑这个表达式哪里来的?反正不是我自己想的,是一位大神用来測试他的算术表达式的,我就拿来測试我的程序呗大笑


    注意:输入表达式后一定要加一个#才干够!!!


    PS:蛋疼死了,明明早就成功了,结果codeblocks由于路径不能是中文搞得我没法调试,浪费时间,还有就是開始得到的老是错误结果,然后我就把程序断点运行了一遍之后,就该了一块地方,可是我认为应该没影响的地方啊!!!然后竟然就成功了!!!!吓尿,还有就是一定要输入完算术表达式后加一个#表示输入结束,不然是得不到正确结果的!!!
  • 相关阅读:
    0401-服务注册与发现、Eureka简介
    001-OSI七层模型,TCP/IP五层模型
    云原生应用开发12-Factors
    0301-服务提供者与服务消费者
    0201-开始使用Spring Cloud实战微服务准备工作
    0107-将Monolith重构为微服务
    0106-选择微服务部署策略
    0105-微服务的事件驱动的数据管理
    0104-微服务体系结构中的服务发现
    0103-微服务架构中的进程间通信
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3793551.html
Copyright © 2011-2022 走看看