zoukankan      html  css  js  c++  java
  • 【算法#4】表达式求值

    最讨厌这种造计算器的题了……

    最近被这种造计算器的题坑了几次,一个还是普及-的题。表达式有很多,但是我们在面对狗屎的中缀表达式的时候有没有一些确定的原则?

    有。其中一个就是在操作符入操作符栈之前,操作符栈顶的操作符优先级一定得严格低于该操作符优先级,否则弹出操作符并且对操作数栈的栈顶数进行运算直到栈空或者当前优先级严格大于栈顶操作符优先级。当然,前提是你采用这种求值方法,其他的东西暂不予考虑。

    首先,我们遇到操作数时,读入操作数并且将操作数加入操作数栈,当我们读入操作符时,弹出操作符栈栈顶元素直到栈顶元素优先级严格小于当前操作符优先级或者栈空。

    读入表达式完毕后,注意此时要是末尾是个操作数记得加入操作数栈,持续弹出操作符栈栈顶元素并且进行计算直到栈空。这样在操作数栈中有且仅有1个的元素就是表达式的值了。

    其他的还有当遇到一个左括号时,直接加入操作符栈,当遇到一个右括号时持续弹出操作符直到遇到一个左括号或者栈空(致命错误)。

    板子贴在这里,不是特别完整,只支持+和*运算,只能输入正整数。其实就是那个普及-的题的代码,稍微魔改一下就可以了。

    print(input())
    

    (雾)

    下面这个是板子。

    #include<bits/stdc++.h>
    using namespace std;
    long long stao[100005],top1,stan[100005],top2,temp;
    string inp;
    bool mk;
    int main(){
        getline(cin,inp);
        for(int i=0;i<inp.length();i++){
            if(inp[i]<='9'&&inp[i]>='0'){
                temp=temp*10+inp[i]-'0';
                mk=1;
            }
            else {
                if(mk){
                    stan[++top2]=temp;
                    temp=0;
                    mk=0;
                }
                if(inp[i]=='+'){
                    while(top1){
                        if(stao[top1]==-1){
                            top1--;
                            top2--;
                            stan[top2]+=stan[top2+1];
                            stan[top2]%=10000;
                        }
                        else{
                            top1--;
                            top2--;
                            stan[top2]*=stan[top2+1];
                            stan[top2]%=10000;
                        }
                    }
                    stao[++top1]=-1;
                }
                else{
                    while(stao[top1]==-2&&top1){
                        top1--;
                        top2--;
                        stan[top2]*=stan[top2+1];
                        stan[top2]%=10000;
                    }
                    stao[++top1]=-2;
                }
            }
        }
        if(mk)
            stan[++top2]=temp;
        while(top1){
            if(stao[top1]==-1){
                top1--;
                top2--;
                stan[top2]+=stan[top2+1];
                stan[top2]%=10000;
            }
            else{
                top1--;
                top2--;
                stan[top2]*=stan[top2+1];
                stan[top2]%=10000;
            }
        }
        cout<<stan[1]%10000;
    }
    
  • 相关阅读:
    记录一个用关于mybatis对象为null的坑
    微信小程序开发初体验--教你开发小程序
    聚合数据全国天气预报api接口
    免费的无次数限制的各类API接口(2)
    外卖订单爬虫(美团,饿了么,百度外卖)
    如何快速开发出一个高质量的APP——创业谈
    调用手机话费充值API的SDK编写思路
    基于Retrotfit2.1+Material Design+ijkplayer开发的一个APP(新闻,gif 动图,视频播放)
    技巧:利用 Workflow 显示附近的免费 Wi-Fi
    MyDiary,《你的名字。》同款日记应用
  • 原文地址:https://www.cnblogs.com/Schwarzkopf-Henkal/p/11830216.html
Copyright © 2011-2022 走看看