标签:操作数 temp top2 top1 stan 算法 操作符 求值 表达式
最讨厌这种造计算器的题了……
最近被这种造计算器的题坑了几次,一个还是普及-的题。表达式有很多,但是我们在面对狗屎的中缀表达式的时候有没有一些确定的原则?
有。其中一个就是在操作符入操作符栈之前,操作符栈顶的操作符优先级一定得严格低于该操作符优先级,否则弹出操作符并且对操作数栈的栈顶数进行运算直到栈空或者当前优先级严格大于栈顶操作符优先级。当然,前提是你采用这种求值方法,其他的东西暂不予考虑。
首先,我们遇到操作数时,读入操作数并且将操作数加入操作数栈,当我们读入操作符时,弹出操作符栈栈顶元素直到栈顶元素优先级严格小于当前操作符优先级或者栈空。
读入表达式完毕后,注意此时要是末尾是个操作数记得加入操作数栈,持续弹出操作符栈栈顶元素并且进行计算直到栈空。这样在操作数栈中有且仅有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;
}
标签:操作数,temp,top2,top1,stan,算法,操作符,求值,表达式 来源: https://www.cnblogs.com/Schwarzkopf-Henkal/p/11830216.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。