一本通1331后缀表达式的值
【题目描述】
从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。
比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,在字符数组A中的形式为:
栈中的变化情况:
运行结果:-47
提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在2^64范围内,如有除法保证能整除。
【输入】
一个后缀表达式。
【输出】
一个后缀表达式的值。
【输入样例】
16 9 4 3 +*-@
【输出样例】
-47
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
long long stack[257];
char s[256];
long long comp(char s[256])//函数
{
long long i=0,top=0,x,y;
while(i<=strlen(s)-2)//除去‘0’和‘@’,所以减2
{
switch(s[i])
{
case'+':stack[--top]+=stack[top+1];break;//如果是“+”号,那么指针下移一个,然后当前指针指的数加上上一个数,以下同理
case'-':stack[--top]-=stack[top+1];break;
case'*':stack[--top]*=stack[top+1];break;
case'/':stack[--top]/=stack[top+1];break;
default:x=0;while(s[i]!=' ') x=x*10+s[i++]-'0';//如果不是运算符,那么当这是一个数时(没有空格),那就要乘以十,就是左移一位,可以这么理解:原来的数后面跟了一个数(其实是一个数),那么前面的数就要乘以十再加上后面的数,才能凑到正确的数值(自己算一算就行,想一想应该能明白)
stack[++top]=x;break;//因为加了一个数,那么指针就要往上指一下,并等于这个数
}
i++;//找下一个
}
return stack[top];//返回最后的值
}
int main()
{
gets(s);
cout<<comp(s);
return 0;
}
不知道哪里做错了,我一定会回来改的!
7.3:
三个多月后我回来了,发现不能是长度减2,应该是读到'@'结束(例题代码坑死人)
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<string> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; long long stack[257]; char s[256]; long long comp(char s[256])//函数 { long long i=0,top=0,x,y; while(s[i]!='@') { switch(s[i]) { case'+':stack[--top]+=stack[top+1];break;//如果是“+”号,那么指针下移一个,然后当前指针指的数加上上一个数,以下同理 case'-':stack[--top]-=stack[top+1];break; case'*':stack[--top]*=stack[top+1];break; case'/':stack[--top]/=stack[top+1];break; default:x=0;while(s[i]!=' ') x=x*10+s[i++]-'0';//如果不是运算符,那么当这是一个数时(没有空格),那就要乘以十,就是左移一位,可以这么理解:原来的数后面跟了一个数(其实是一个数),那么前面的数就要乘以十再加上后面的数,才能凑到正确的数值(自己算一算就行,想一想应该能明白) stack[++top]=x;break;//因为加了一个数,那么指针就要往上指一下,并等于这个数 } i++;//找下一个 } return stack[top];//返回最后的值 } int main() { gets(s); cout<<comp(s); return 0; }