1358:中缀表达式值(expr)
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 5568 通过数: 1970
【题目描述】
输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。
注意:必须用栈操作,不能直接输出表达式的值。
【输入】
一行为一个以@结束的字符串。
【输出】
如果表达式不合法,请输出“NO”,要求大写。
如果表达式合法,请输出计算结果。
【输入样例】
1+2*8-9@
【输出样例】
8
这道题和计算(T1356)不能说相识,几乎完全一样,只不过表达式不一定合法
判断是否合法的依据:
1.括号是否匹配
2.数列是否缺少
3.(除数是否为0),测试数据没有这一项,我也没有加
高速公路(T1356):
https://blog.youkuaiyun.com/way_back/article/details/120808872?spm=1001.2014.3001.5501https://blog.youkuaiyun.com/way_back/article/details/120808872?spm=1001.2014.3001.5501
https://blog.youkuaiyun.com/way_back/article/details/120808872?spm=1001.2014.3001.5501------------------------------------------------------------------------------------------------------------------------------
代码如下
#include<stack>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stdlib.h>
std::stack <int>num;
std::stack <char>expr;
int n;
char s[32768];
int check(char c){
if(c=='-' || c=='+')return 1;
else if(c=='*'|| c=='/')return 2;
else if(c=='^')return 3;
else return 0;
}
void rule(){
int r=0;
for(int i=1;i!='@';i++){
if(s[i]=='('){
r++;
}
else if(s[i]==')'){
if(r<=0){
printf("NO");
exit(0);
}
else r--;
}
}
if(r!=0){
printf("NO");
exit(0);
}
else return;
}
void deal(){
if(num.empty() || expr.empty()){
printf("NO");
exit(0);
}
int a=num.top();
num.pop();
if(num.empty()){
printf("NO");
exit(0);
}
int b=num.top();
num.pop();
char c=expr.top();
expr.pop();
if(c=='+')num.push(a+b);
else if(c=='-')num.push(b-a);
else if(c=='/'){
if(a!=0)
num.push(b/a);
else{
printf("NO");
exit(0);
}
}
else if(c=='*')num.push(a*b);
else if(c=='^')num.push(pow(b,a));
}
int main(){
int temp=0;
bool digtal=false;
scanf("%s",s+1);
n=strlen(s+1);
rule();
for(int i=1;s[i]!='@';i++){
if(s[i]>='0' && s[i]<='9'){
temp=s[i]-'0'+temp*10;
digtal=true;
}
else{
if(digtal){
num.push(temp);
temp=0;
digtal=false;
}
if(s[i]=='('){
expr.push(s[i]);
continue;
}
else if(s[i]==')'){
while(expr.top()!='(')
deal();
expr.pop();
continue;
}
while(!expr.empty() &&check(expr.top())>=check(s[i]))
deal();
expr.push(s[i]);
}
}
if(digtal)
num.push(temp);
while(!expr.empty())
deal();
printf("%d",num.top());
return 0;
}
测试结果:
程序运行结果
用户名:MaryL,题目编号:1358,运行编号:12805620,代码长度:1674Bytes
通过
| 测试点 | 结果 | 内存 | 时间 |
| 测试点1 | 答案正确 | 428KB | 4MS |
| 测试点2 | 答案正确 | 428KB | 5MS |
| 测试点3 | 答案正确 | 424KB | 5MS |
| 测试点4 | 答案正确 | 416KB | 6MS |
| 测试点5 | 答案正确 | 416KB | 7MS |

该博客介绍了如何处理一个输入的中缀表达式,包括检查其合法性,将其转换为后缀表达式,并计算后缀表达式的值。题目要求使用栈操作完成,不允许直接计算中缀表达式的值。博客提到了判断表达式合法性的三个条件:括号匹配、数列完整、除数非零,并给出了一个与之相关的已解决题目链接。
2124

被折叠的 条评论
为什么被折叠?



