数据结构中的表达式求值

来源:互联网 发布:mac pro type c 编辑:程序博客网 时间:2024/05/29 12:20

表达式求值是数据结构中关于栈的一个应用,主要就是让计算机模拟人脑来计算表达式,这中间就不免涉及到运算符的优先级问题以及括号的处理,运算符的优先级问题,相比之下比较好解决点(我只处理了+、-、*、/、%五种操作符以及括号),在hash中定义它们的优先级,而对于括号,怎么来处理,其实你可以把有括号的表达式看成是多个表达式,相匹配的括号中看成一个表达式,然后把这里面的值求出来,一层一层向外推进,最后,就变成没有括号的表达式求值,这样,求取就简单多了。我的程序只处理了+、-、*、/、%、(、)这几种操作符,没有处理单目的操作符,中间没有对*、/、%结果溢出的处理(数据用long long存放的,计算的范围相比之下会大些),下面是具体的代码:

#include<iostream>#include<string>#include<algorithm>#define MAX_N 0x80#define MAX_M 1<<15using namespace std;int hash[MAX_N];//用于提取操作数long long draw(string& s,unsigned& pos){    long long number = 0;    for(unsigned len=s.size(); pos<len&&s[pos]>='0'&&s[pos]<='9'; ++pos)        number = number*10+s[pos]-48;    pos--;    return number;}long long calc(long long* num,int& top,char op){    long long a,b,c ;    b = num[--top];    a= num[--top];    switch(op)    {    case '+':        c = a + b;        break;    case '-':        c = a - b;        break;    case '*':        c = a * b ;        break;    case '/':        if(b==0)        {            cout << "除数为0" << endl;            exit(-1);        }        c = a / b;        break;    case '%':        if(b==0)        {            cout << "模数为0" << endl;            exit(-1);        }        c= a % b;    }    return c;}long long solve(string s){    char option[MAX_M]= {'\0'};              //操作符栈    long long num[MAX_M]= {0};               //操作数栈    int top1 = 0,top2=0;                     //设置栈顶    //定义优先级    hash['+'] = 1,hash['-']=1,hash['*']=2,hash['/'] = 2,hash['%'] =2,hash['(']=0;    for(unsigned i=0,len=s.size(); i!=len; ++i)    {        if(s[i]>='0'&&s[i]<='9')        {            num[top2++] = draw(s,i);        }        else if(s[i]!=' ')        {            if(s[i]==')')            {                while(option[top1-1]!='(')                {                    long long temp = calc(num,top2,option[--top1]);                    num[top2++] = temp;                }                //舍掉左括号                --top1;            }            //如果是左括号,直接进栈            else if(s[i]=='(')                    option[top1++] = '(' ;            //当前操作符的优先级比栈顶的高或者栈为空,直接入栈            else if(!top1 || hash[option[top1-1]]<hash[s[i]])                option[top1++] = s[i];            //当前操作符优先级小于等于栈顶元素的优先级,弹栈,直到栈空或者栈顶的元素优先级大于当前的操作符            else            {                while(top1&&hash[option[top1-1]]>=hash[s[i]])                {                    long long temp = calc(num,top2,option[--top1]);                    num[top2++] = temp;                }                //将当前操作符放入操作符栈                option[top1++] = s[i];            }        }    }    //操作符栈中可能还有操作符    while(top1)    {        long long temp = calc(num,top2,option[--top1]);        num[top2++] = temp;    }    return num[0];}int main(){    string s ;    getline(cin,s);    long long res = solve(s);    cout << res << endl ;    return 0;}


原创粉丝点击