zoukankan      html  css  js  c++  java
  • HDU_1237_简单计算器

    运算符为+,-,*,/;操作数为整数;且没有括号

    设定符号优先级,先在栈底压运算符0

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<stack>
    using namespace std;
    
    stack<int> op;
    stack<double> num;
    
    char input[205];
    
    bool prio[][5]=
    {
        1,0,0,0,0,    //0
        1,0,0,0,0,    //+
        1,0,0,0,0,    //-
        1,1,1,0,0,    //*
        1,1,1,0,0,    //,/
    };
    
    void getNext(bool &isOp,int &opNum,int &loc)
    {
        if('0'<=input[loc]&&input[loc]<='9')
        {
            int tmp=0;
            while(input[loc]!=' '&&input[loc]!=0)
            {
                tmp*=10;
                tmp+=input[loc]-'0';
                loc++;
            }
            isOp=0;
            opNum=tmp;
            if(input[loc]!=0)
                loc++;
        }
        else
        {
            isOp=1;
            if(input[loc]==0)
                opNum=0;
            else if(input[loc]=='+')
                opNum=1;
            else if(input[loc]=='-')
                opNum=2;
            else if(input[loc]=='*')
                opNum=3;
            else
                opNum=4;
            loc+=2;
        }
    }
    
    int main()
    {
        while(gets(input))
        {
            while(!op.empty())
                op.pop();
            while(!num.empty())
                num.pop();
            if(strlen(input)==1&&input[0]=='0')
                break;
            bool isOp=0;
            int opNum=0,loc=0;
            op.push(0);
            while(loc<=strlen(input))
            {
                getNext(isOp,opNum,loc);
                if(isOp==0)
                    num.push(opNum);
                else
                {
                    int opTop=op.top();
                    if(prio[opNum][opTop]==1)
                        op.push(opNum);
                    else
                    {
                        while(prio[opNum][opTop]==0) //这个地方之前出错,当当前运算符优先级比栈顶元素低,应该一直计算至栈顶元素优先级低于当前元素优先级
                        {
                            double num2=num.top();
                            num.pop();
                            double num1=num.top();
                            num.pop();
                            int nowOp=op.top();
                            op.pop();
                            opTop=op.top();
                            if(nowOp==1)
                                num.push(num1+num2);
                            else if(nowOp==2)
                                num.push(num1-num2);
                            else if(nowOp==3)
                                num.push(num1*num2);
                            else if(nowOp==4)
                                num.push(num1/num2);
                        }
                        op.push(opNum);
                    }
                }
            }
            printf("%.2f
    ",num.top());
        }
        return 0;
    }
  • 相关阅读:
    博客园特效页脚保存
    go channel
    goland 注册
    mac安装go环境
    go 结构体与方法
    gin教程
    hihocoder234周 计算不包含黑点的矩形个数
    参考文献的正确姿势
    vscode用法
    使用extract-text-webpack-plugin提取css文件
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/8496906.html
Copyright © 2011-2022 走看看