栈实现表达式求值(多位数)加减乘除括号

 

 

    表达式求值

 

题目描述:输入一个表达式,含加减乘除括号运算,输出表达式的值。

 

 

例如:求20+(3*400)-100/3的值

代码如下:

 

#include
#include
using namespace std;
bool cmp(char a,char b)//优先级判断函数
{
    if(a=='*'||a=='/'){
        if(b=='*'||b=='/')
        return false;
        else
            return true;}
    else
        return false;
}
void f1(string s)//求值函数
{
    stackczstack;///操作符栈
    stackqzstack;//数字栈
    int len=s.length();
    for(int i=0;i='0'&&t<='9'){     //数字直接入栈
            float p=(t-'0')*1.0;
    while(s[i+1]>='0'&&s[i+1]<='9')//多位数转换
    {
        p=(p*10+s[i+1]-'0')*1.0;
        i++;
    }
            qzstack.push(p);
    }
    else if(t==')'){
        char ope=czstack.top();
    while(ope!='('){
            float x=qzstack.top();qzstack.pop();
            float y=qzstack.top();qzstack.pop();
            float tmp;
            if(ope=='+')tmp=x+y;
            else if(ope=='-')tmp=y-x;
            else if(ope=='*')tmp=x*y;
            else
                tmp=y/x;
            qzstack.push(tmp);
            czstack.pop();
            ope=czstack.top();
          }
          czstack.pop();
    }
    else{
            if(czstack.empty())
            czstack.push(t);
            else{
        char stp=czstack.top();
        if(stp=='('||cmp(t,stp))
            czstack.push(t);
        else{
            while(!cmp(t,stp)&&!czstack.empty()&&stp!='('){
                    czstack.pop();
            float x=qzstack.top();qzstack.pop();
            float y=qzstack.top();qzstack.pop();
            float tmp;
            if(stp=='+')tmp=x+y;
            else if(stp=='-')tmp=y-x;
            else if(stp=='*')tmp=x*y;
            else if(stp=='/')
                tmp=y/x;
                qzstack.push(tmp);
                    if(!czstack.empty())
                        stp=czstack.top();
                    }
                    czstack.push(t);
        }
    }
    }
}
    while(!czstack.empty()){
        char t=czstack.top();
         float x=qzstack.top();qzstack.pop();
            float y=qzstack.top();qzstack.pop();
            float tmp;
            if(t=='+')tmp=x+y;
            else if(t=='-')tmp=y-x;
            else if(t=='*')tmp=x*y;
            else if(t=='/')
                tmp=y/x;
                qzstack.push(tmp);
        czstack.pop();
    }
   cout<>a;
    f1(a);
    return 0;
}

 

运行截图:

栈实现表达式求值(多位数)加减乘除括号_第1张图片

注意

括号在入栈前优先级最高,但入栈后优先级降为最低。

欢迎评论交流,涛哥等待你的灼见。

 

你可能感兴趣的:(栈实现表达式求值(多位数)加减乘除括号)