【例1-2】后缀表达式的值

时间限制: 10 ms        内存限制: 65536 KB
提交数: 850     通过数: 119 

【题目描述】

从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。

比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,在字符数组A中的形式为:

栈中的变化情况:

运行结果:-47

提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在264264范围内,如有除法保证能整除。

【输入】

一个后缀表达式。

【输出】

一个后缀表达式的值。

【输入样例】

16 9 4 3 +*-@

【输出样例】

-47

【算法分析】

就是上面的图。

【代码实现】

 

#include<bits/stdc++.h>
using namespace std;
char s[256];
int num[256];
int comp(char s[256])
{

   int i=0,top=0,x,y;
   while(i<=strlen(s)-2)
   { 
       switch(s[i])
       {

       case'+':num[--top]+=num[top+1];break;//运算符
       case'-':num[--top]-=num[top+1];break;
       case'/':num[--top]/=num[top+1];break;
       case'*':num[--top]*=num[top+1];break;
       default: x=0; while(s[i]!=' ') x=x*10+s[i++]-'0';//数
        num[++top]=x;  break;//top++;num[top

       }
        i++;
   }
   return num[top];

}
int main()
{

  gets(s);

   cout<<comp(s)<<endl;
}

16 9 4 3 +*-@

//for(int j=0;j<=i;j++)
       cout<<num[j]<<" ";
       cout<<endl;0 16 0

0 16 9 0 0

0 16 9 4 0 0 0

0 16 9 4 3 0 0 0 0

0 16 9 7 3 0 0 0 0 0

0 16 63 7 3 0 0 0 0 0 0

0 -47 63 7 3 0 0 0 0 0 0 0

-47



Process returned 0 (0x0)   execution time : 2.474 s

Press any key to continue.