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

时间限制: 10 ms 内存限制: 65536 KB
提交数: 21050 通过数: 3824
【题目描述】
从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。

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

栈中的变化情况:

运行结果:-47

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

【输入】
一个后缀表达式。

【输出】
一个后缀表达式的值。

【输入样例】
16 9 4 3 +*-@
【输出样例】
-47

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

int main()
{
    char exp[251];
        cin.getline(exp,251);
    
    char operstack[125];
    long long numberstack[251];
        memset(operstack,0,sizeof(operstack));
        memset(numberstack,0,sizeof(numberstack));
        
    char* end=exp;
    for(;*end!='@';end++)
    {
    }
    end--;
    //读入 符号
    do{
        end--;
    }while(*end!=' ');
    int add=0;
    while(*++end!='@')
    {
        operstack[add++]=*end;
    }
    int front=0;
    do{
        end--;
    }while(*end!=' ');
    while(end>exp)
    {
        if(end==' ') end=0;
        end--;
    }
    while(*end!=operstack[0])
    {
        numberstack[front++]=atoll(end);
        end+=strlen(end)+1;
    }
    char* nowoper=operstack;
    while(front--)
    {
        switch (*nowoper)
        {
            case '+':
                numberstack[front-1]+=numberstack[front];
                break;
            case '-':
                numberstack[front-1]-=numberstack[front];
                break;
            case '*':
                numberstack[front-1]*=numberstack[front];
                break;
            case '/':
                numberstack[front-1]/=numberstack[front];
                break;
        }
        //cout<<numberstack[front-1];
        nowoper++;
    }
    cout<<numberstack[0];
    
    return 0;
}
Last modification:January 2nd, 2021 at 11:44 am