时间限制: 10 ms 内存限制: 65536 KB
提交数: 25818 通过数: 5093
【题目描述】
从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。
比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,在字符数组A中的形式为:
栈中的变化情况:
运行结果:-47
提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在2^64范围内,如有除法保证能整除。
【输入】
一个后缀表达式。
【输出】
一个后缀表达式的值。
【输入样例】
16 9 4 3 +*-@
【输出样例】
-47
//#include<bits/stdc++.h>
//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char a[250]={0};
long long int b[250]={0};
// gets(a);
cin.getline(a,250);
int n = strlen(a);
int tap = 0;
for(int i=0;i<n-1;i++){
if(a[i]>='0'&&a[i]<='9'){
b[tap] = b[tap]*10+a[i]-'0';
}
if(a[i]==' '){
tap++;
}else{
if(a[i]<'0'||a[i]>'9'){
tap--;
if(a[i]=='+'){
b[tap-1] = b[tap-1]+b[tap];
}
else if(a[i]=='-'){
b[tap-1] = b[tap-1]-b[tap];
}
else if(a[i]=='*'){
b[tap-1] = b[tap-1]*b[tap];
}
else if(a[i]=='/'){
b[tap-1] = b[tap-1]/b[tap];
}
}
}
}
cout<<b[0];
return 0;
}
总结
1、DevC++出现调试与实际运行结果不一样
经过百度,发现没有赋初值,调试器和实际很可能是不一样的。调试器里很可能给它一个初始值0,而实际则不会。给a[i]b[i]赋初值后运行正常。
总结:在写程序时,一定要注意赋初值。
2、cin.getline(a,250)
替代gets(a)
3、注意读题,264 为long long, 232为int (long)