**
*题目:使用栈实现后缀表达式计算 要求: 使用栈实现后缀表达式计算,其中,在后缀表达式中,输入的数字为整数,且为 正数,数字、符号之间用空格隔开,整个后缀表达式用“#”表示结束。 输入样例: 11 2 3 + # 输出样例: 55
**
思路及难点:
数字入栈,遇到符号立即计算
如遇到+,进行的运算是num1 + num2;
num2是栈顶元素
num1是栈顶下面的第一个数字
所以在保存num2后需要出栈一次,求得num2,然后将运算后的结果赋值给栈顶。
int num2 = nums.top();
nums.pop();
int num1 = nums.top();
nums.top() = calculate(num1, num2, instream);
break;
处理了很久的,char怎么转成double
cin.putback(instream);
cin >> number;
nums.push(number);
iostream是一个类,有自己的buffer。你每次cin>>a,它就把buffer减一,放到a中去。cin.putback(a)就是把a的内容放回buffer中。
再通过输入输出流进行自动的格式转换,很细节
/*题目:使用栈实现后缀表达式计算
要求:
使用栈实现后缀表达式计算,其中,在后缀表达式中,输入的数字为整数,且为
正数,数字、符号之间用空格隔开,整个后缀表达式用“#”表示结束。
输入样例:
1 22 3 + * #
输出样例:
55
*/
//顺序栈实现后缀表达式计算
//author:zlb
//data:3.16
#include <iostream>
#include <stack>
using namespace std;
double calculate(double num1, double num2, char c) {
switch (c)
{
case'+':
return num1 + num2;
case'-':
return num1 - num2;
case'*':
return num1 * num2;
case'/':
return num1 / num2;
}
}
int main() {
char instream;
double number;
stack<double>nums;
while (cin >> instream)
{
if (instream == '#')
{
break;
}
switch (instream)
{
case '*':
case '/':
case '+':
case '-': {
int num2 = nums.top();
nums.pop();
int num1 = nums.top();
nums.top() = calculate(num1, num2, instream);
break;
}
default:
cin.putback(instream);
cin >> number;
nums.push(number);
}
}
cout << nums.top();
}