【足迹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由于路径不能是中文搞得我没法调试,浪费时间,还有就是開始得到的老是错误结果,然后我就把程序断点运行了一遍之后,就该了一块地方,可是我认为应该没影响的地方啊!!!然后竟然就成功了!!!!吓尿,还有就是一定要输入完算术表达式后加一个#表示输入结束,不然是得不到正确结果的!!!

【足迹C++primer】表达式求值,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。