表达式求值--三合一

表达式求值是一道非常有趣的题目,他很好的演示了栈的应用,后缀表达式求值最为简单,当读入操作数时压栈,当读入运算符时,从栈中弹出两个数,运算完之后将结果再压栈。知道输入完之后,栈顶的值就是表达式的值。中缀表达式求值,用到了两个栈,一个存放数一个存操作数,当输入操作数时,直接进栈,当是运算符时,若优先级高于栈顶,则出栈运算再入栈,直到运算符优先级低于输入的那个。若输入的优先级低于栈顶,则直接入栈。若为括号,则出栈运算直到消掉括号。我将中缀表达式求值,中缀转后缀,后缀表达式求值写在一起,一次输入,三个结果,相互验证。

#include <iostream>
#include <string>
#include<stack>
using namespace std;
int Comp(char str1, char str2)
{
    switch (str1)
    {
		case '+':  case '-':  if (str2 == '(' || str2 == '#') return 1;  else return -1;
          		              break;
        case '*':  case '/':  if (str2 == '*' || str2 == '/') return -1;  else return 1;
        	                  break;
        case '(':  return 1;  break;
        case ')':  if (str2 == '(') return 0; else return -1;
                   break;
        case '#':  if (str2 == '#') return 0; else return -1;
                   break;
        default:  break;
    }
}
//运算中缀表达式
void  Compute(string ch)
{
    stack<char> OPTR;
    stack<int> OPND;
    ch=ch+'#';
    OPTR.push('#');
    for (int i = 0;ch[i]!= '\0';)
    {
        if(ch[i]>='0'&&ch[i]<='9')
        {
            int m=ch[i++]-48;
            OPND.push(m);
        }
        else
        {
            int k;
            k=Comp(ch[i],OPTR.top());
            if(k==1)
            {
                OPTR.push(ch[i++]);
            }
            else if(k==-1)
            {
                int z;
                int y=OPND.top();
                OPND.pop();
                int x=OPND.top();
                OPND.pop();
                char op=OPTR.top();
                OPTR.pop();
                switch(op)
                {
                    case '+': z = x + y;  break;
                    case '-':  z = x - y; break;
            	    case '*': z = x * y;  break;
                	case '/': if(y==0){cout<<"除数为0!"<<endl;return;}z = x / y;  break;
                    default:  break;
                }
                OPND.push(z);
            }
            else
            {
                OPTR.pop();
                i++;
            }
        }
    }
    cout<<OPND.top();
}
//中缀转后缀
string  Compute_tohou(string ch)
{
    string result;
    stack<char> OPTR;
    ch=ch+'#';
    OPTR.push('#');
    for (int i = 0;ch[i]!='\0';)
    {
        if(ch[i]>='0'&&ch[i]<='9')
        {
            result=result+ch[i++];
        }
        else
        {
            int k;
            k=Comp(ch[i],OPTR.top());
            if(k==1)
            {
                OPTR.push(ch[i++]);
            }
            else if(k==-1)
            {

                char op=OPTR.top();
                OPTR.pop();
                result=result+op;
            }
            else
            {
                OPTR.pop();
                i++;
            }
        }
    }
    return result;
}
//运算后缀表达式
int PostFixRun (string ch)
{
   stack<int> stk;
   for(int i=0;i<ch.size();i++)
   {
       if(ch[i]>='0'&&ch[i]<='9')
       {
           int m=ch[i]-48;
           stk.push(m);
       }
       else
       {
           int b=stk.top();
           stk.pop();
           int a=stk.top();
           stk.pop();
           if(ch[i]=='+')
           {
               stk.push(a+b);
           }
           else if(ch[i]=='-')
           {
               stk.push(a-b);
           }
           else if(ch[i]=='*')
           {
               stk.push(a*b);
           }
           else
           {
               if(b==0){cout<<"除数为0!"<<endl;return 0;}
               stk.push(a/b);
           }
       }
   }
   return stk.top();
}
int main()
{
    string str;
    cout << "请输入一个表达式:";
    cin >> str;
    cout << "中缀表达式的值是:";
    Compute(str);
    string res=Compute_tohou(str);
    cout<<"\n中缀转后缀表达式的结果:"<<res<<endl;
    int t=PostFixRun(res);
    cout<<"后缀表达式的值是:"<<t<<endl;
    return 0;
}

运行结果:

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值