一本通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;
}

 

posted @ 2020-03-31 23:22  徐明拯  阅读(818)  评论(1编辑  收藏  举报