算法#4表达式求值
Posted schwarzkopf-henkal
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法#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;
}
以上是关于算法#4表达式求值的主要内容,如果未能解决你的问题,请参考以下文章