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;
    }
    
  • 相关阅读:
    Bootstrap按钮
    Bootstrap表单
    Bootstrap表格
    Bootstrap列表
    jq 的onchange事件
    php 跳出循环的几种方式
    php变量和字符串连接符——点
    php 从2维数组组合为四维数组分析
    mysql 删除表中记录
    mysql 聚合函数
  • 原文地址:https://www.cnblogs.com/Schwarzkopf-Henkal/p/11830216.html
Copyright © 2011-2022 走看看