栈的新手,求大佬指点

P1449 后缀表达式

wang0728 @ 2023-07-24 16:34:39

#include <bits/stdc++.h>
using namespace std;
char s[55];
stack<int>t;
int a,b;
int main(){
    for(int i=0;s[i]!='@';i++){
        cin>>s[i];
        if(s[i]!='.'&&s[i]>='0'&&s[i]<='9'){
            t.push(s[i]);
        }
        else if(s[i]=='+'){
            t.pop();
            a=t.top();t.pop();
            b=t.top();t.pop();
            t.push(b+a);
        }
        else if(s[i]=='-'){
            t.pop();
            a=t.top();t.pop();
            b=t.top();t.pop();
            t.push(b-a);
        }
        else if(s[i]=='*'){
            t.pop();
            a=t.top();t.pop();
            b=t.top();t.pop();
            t.push(b*a);
        }
        else if(s[i]=='/'){
            t.pop();
            a=t.top();t.pop();
            b=t.top();t.pop();
            t.push(b/a);
        }
//      cout<<s[i]<<" ";
    }
//  while(!t.empty()){
//      cout<<t.top();
//      t.pop();
//  }
    cout<<t.top();
    return 0;
}

by ran_qwq @ 2023-07-24 16:54:50

@wang0728 问题有两个

  1. 如果输入的数是一个两位数呢?应该维护一个变量 x,每次遇到一个数字,把该数字加进 x 的末尾(x=x*10+s[i]-'0')。注意 s[i] 读入进来的是数字的 ASCII 码,要减去 '0'。遇到 . 才把 x 压入栈中并 x=0。

  2. 遇到加减乘除时 pop 了三次,应去掉第一次,会导致 RE。


by wang0728 @ 2023-07-25 09:11:50

@ran_qwq 谢谢,我改一下


|