p1449 后缀表达式 -栈

题目描述

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。

输入格式:

输入:后缀表达式

输出格式:

输出:表达式的值

输入样例 

3.5.2.-*7.+@

输出样例:

16

思路:标准的栈的练习

code:

#include<iostream>
#include<stack>
using namespace std;
string s;
int suan(int ,int ,char );

int main()
{
    stack<int> q;
    cin>>s;
    int i=0;
    int num,num1,num2;
    int x;
    while(s[i]!='@')
    {
        if(s[i]=='.')
        {
            ++i;
            continue;
        }
        num=0;
        bool flag=false;
        while(s[i]>='0'&&s[i]<='9')
        {
            flag=true;
            x=(s[i]-'0');
            num=num*10+x;
            ++i;
        }
        if(flag)
        {
            q.push(num);
        }
        if(s[i]=='+'||s[i]=='*'||s[i]=='-'||s[i]=='/')
        {
            num1=q.top();
            q.pop();
            num2=q.top();
            q.pop();
            num=suan(num2,num1,s[i]);
            q.push(num);
        }
        ++i;
    }
    num=q.top();
    cout<<num;
    return 0;
}
int suan(int num1,int num2,char t)
{
    switch(t)
    {
    case '+':
        return num1+num2;
    case '-':
        return num1-num2;
    case '*':
        return num1*num2;
    case '/':
        return num1/num2;
    }
}




猜你喜欢

转载自blog.csdn.net/sdau_fangshifeng/article/details/79901170