原题链接http://ybt.ssoier.cn:8088/problem_show.php?pid=1331
审题这道题其实就是一个简单的数学运算,只不过是用后缀表达式,直接看一下下面的解题思路吧。
思路注意到数据范围,我们开一个long long的栈,别忘了加头文件stack。
stackstk;
接着我们用getline来输入带空格的表达式str。代码如下:
string str; getline(cin,str); long long cnt=0; long long a,b;
然后进行循环判断。(具体详解如下代码中的注释)。
for(int i=0;i='0'&&str[i]<='9'){//判断当前字符是否为数字 cnt=(str[i]-48)+cnt*10;//按数位计算数字 } if(str[i]==' '){//如果当前字符是空格,就说明数字读取完毕 stk.push(cnt);就将计算好的cnt入栈 cnt=0;//再将cnt归零 } if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){//如果当前字符时运算符号 b=stk.top();//将栈顶赋值给b stk.pop();//删除栈顶 a=stk.top();//将新栈顶赋值给a stk.pop();//删除栈顶 //判断符号进行运算 if(str[i]=='+'){ stk.push(a+b); }else if(str[i]=='-'){ stk.push(a-b); }else if(str[i]=='*'){ stk.push(a*b); }else if(str[i]=='/'){ stk.push(a/b); } } if(str[i]=='@'){//如果当前字符为@,直接终端循环 break; } }
最后将栈里剩下唯一的一个数——也就是运算结果——也就是栈顶输出。代码如下:
cout<完整代码 #include#include #include using namespace std; stack stk; int main(){ string str; getline(cin,str); long long cnt=0; long long a,b; for(int i=0;i ='0'&&str[i]<='9'){ cnt=(str[i]-48)+cnt*10; } if(str[i]==' '){ stk.push(cnt); cnt=0; } if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){ b=stk.top(); stk.pop(); a=stk.top(); stk.pop(); if(str[i]=='+'){ stk.push(a+b); }else if(str[i]=='-'){ stk.push(a-b); }else if(str[i]=='*'){ stk.push(a*b); }else if(str[i]=='/'){ stk.push(a/b); } } if(str[i]=='@'){ break; } } cout<



