zoukankan      html  css  js  c++  java
  • 栈的应用 表达式求值

    后天考概率论了,
     Σ(|||▽||| ) 

                                      而我还在这找bug,

                                             ≥﹏≤ 

                                                                                          好在是最后终于成功了   啊  哈哈哈!!!

                                                                                                              (๑>؂<๑) 


    注意操作数只能是一位数哦!!!!

    输入表达式时要切换成英文括号哦!!!

    这里实用的栈是数组构成,就不像书上那样什么    抽象数据类型定义了   的啦


    #include <iostream>
    
    using namespace std;
    
    #define MAXSIZE 50
    
    char EvaluateExpression();               //表达式求值
    bool In(char ch);                        //判断输入字符ch是否为运算符
    char Precede(char a,char b);             //比较优先级
    char Operate(char a,char opera,char b);  //二元运算
    
    
    int main()
    {
        int a=EvaluateExpression();
        cout<<a;
        return 0;
    }
    
    
    char EvaluateExpression()  //表达式求值
    {
        int a,b,c;
        char ch;
        int i=-1,j=-1;//栈的计数器
        char OPND[MAXSIZE];//操作数栈
        char OPTR[MAXSIZE];//操作符栈
    
        cout<<"请输入计算公式:"<<endl<<"例如格式为a*(b+c)="<<endl;
    
        cin>>ch;
        OPTR[++i]='=';
        while(ch!='='||OPTR[i]!='=')  //仅当ch为'='并且栈OPTR中只有'='时停止循环
        {
            if(!In(ch)) //如果不是操作符
            {
                OPND[++j]=ch;
                cin>>ch;
            }
            else
                switch(Precede(OPTR[i],ch))
                {
                case '<':
                    OPTR[++i]=ch;
                    cin>>ch;
                    break;
                case '>':
                    b=OPND[j--];  //OPND出栈
                    a=OPND[j--];  //OPND出栈
                    c=Operate(a,OPTR[i--],b);  //OPTR出栈参与a与b的运算
                    OPND[++j]=c;
                    break;
                case '=':
                    i--; //OPTR出栈
                    cin>>ch;
                    break;
                }
        }
        return (OPND[j]-48);
    }
    
    bool In(char ch)//判断输入字符ch是否为运算符
    {
        if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='=')
            return true;
        else
            return false;
    }
    
    char Precede(char a,char b)  //比较优先级
    {
        if(a=='('&&b==')' || a=='='&&b=='=')
            return '=';
        else if(a=='('||a=='='||b=='(' || (a=='+'||a=='-')&&(b=='*'||b=='/'))
            return '<';
        else
            return '>';
    
    }
    
    char Operate(char a,char opera,char b) //二元运算
    {
        switch(opera)
        {
        case '+':
            return (a-'0')+(b-'0')+48;
        case '-':
            return (a-'0')-(b-'0')+48;
        case '*':
            return (a-'0')*(b-'0')+48;
        case '/':
            return (a-'0')/(b-'0')+48;
        }
    }
    






    马上要考概率论了,祝自己好运๑乛◡乛๑



  • 相关阅读:
    MVP福利利用Azure虚拟机玩Windows Server 2012
    负载均衡的基本算法
    RavenDB:基于Windows/.NET平台的NoSQL数据库
    使用Autofac在ASP.NET Web API上实现依赖注入
    Mono 3 的默认Gc是Sgen
    MSDN 杂志 Windows 8 特刊
    AggSharp Agg的.NET 移植
    使用谷歌翻译/微软翻译迅速使你的博客支持多国语言
    Service Bus for Windows server
    用Xwt构建跨平台应用程序[转载]
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746129.html
Copyright © 2011-2022 走看看