#include<bits/stdc++.h>; using namespace std; const int maxn=50; int n; int top; int v[maxn]; char s[maxn],c[maxn]; void Push(int x,int flag){ if(!flag){ c[++top]=x; }else{ v[top]=x; } } void Pop(){ if(top<=0){ cout<<"NO"; exit(0); } if(c[top]=='+'){ v[top-1]+=v[top]; } if(c[top]=='-'){ v[top-1]-=v[top]; } if(c[top]=='*'){ v[top-1]*=v[top]; } if(c[top]=='/'){ v[top-1]/=v[top]; } if(c[top]=='^'){ v[top-1]+=pow(v[top]-1,v[top]); } --top; } int Opr(char x){ if(x=='+'||x=='-'){ return 0; } if(x=='*'||x=='/'){ return 1; } if(x=='^'){ return 2; } return 0; } bool Check(char x){ if(Opr(x)<=Opr(c[top])){ return true; } return false; } int main() { char s[maxn]; cin>>s; n=strlen(s)-1; s[n]=')'; Push('(',0); for(int i=0;i<=n;i++){ while(s[i]=='('){ Push(s[i++],0); } if(!isdigit(s[i])){ cout<<"NO"; return 0; } int x=0; while(isdigit(s[i])){ if(s[i]==')'){ while(c[top]!='('){ Pop(); } v[top-1]=v[top--]; }else{ while(Check(s[i])){ pop(); } Push(s[i],0); break; } ++i; if(i>n){ break; } } if(top>0){ cout<<"NO"; }else{ cout<<v[0]; } } return 0; }
时间: 2024-04-17 22:28:24 浏览: 56
万能头文件#include“bitsstdc++.h”.docx
这段代码是一个简单的表达式计算器。它通过栈来处理表达式中的括号,并根据运算符的优先级来计算表达式的值。
代码中的主要函数是`Push()`和`Pop()`,它们用于处理栈的入栈和出栈操作。`Opr()`函数用于返回运算符的优先级,`Check()`函数用于判断当前运算符是否需要出栈。
在`main()`函数中,程序首先读取一个表达式字符串,然后遍历字符串中的每个字符。如果遇到左括号,则将其入栈;如果遇到数字,则将其转化为整数并入栈;如果遇到运算符,则根据其优先级判断是否需要出栈,并将当前运算符入栈。
在表达式遍历完后,如果栈不为空,则输出"NO",表示表达式不合法;否则,输出栈顶元素,即为表达式的计算结果。
需要注意的是,代码中有一些错误。例如,`pop()`应该是`Pop()`,`s`数组重复定义了两次,`pop()`函数没有定义等等。你可以将这些错误修正后再运行代码。
阅读全文