栈的应用【实验题】
使用栈实现后缀表达式计算,其中,在后缀表达式中,输入的数字为整数,且为正数,数字、符号之间用空格隔开,整个后缀表达式用“#”表示结束。其中,整个后缀表达式长度不超过200,每个数字位数不超过10。
提示:读取数据的过程中,可以利用栈处理每个数字。
输入样例:
11 2 3 + * #(注:对应的中缀表达式是11*(2+3))
6 2 3 + * 5 / 7 - #(注:对应的中缀表达式是6*(2+3)/5-7)
输出样例:
55
-1
#include<iostream>
#include<string>
using namespace std;
struct stack
{
int a[300];
int index = -1;
void instack(int x) //入栈操作
{
a[++index] = x;
}
void calculate(char k) //k是运算符
{
int sum = 0;
int k1, k2;
k1 = showtop(); outstack();
k2 = showtop(); outstack();
if (k == '+')
{
sum = k1 + k2;
}
else if (k == '-')
{
sum = k2 - k1;
}
else if (k == '*')
{
sum = k1 * k2;
}
else if (k == '/')
{
sum = k2 / k1;
}
instack(sum);
}
void outstack() //出栈
{
index--;
}
int showtop() //显示栈顶字符
{
return a[index];
}
};
int main()
{
stack f;
string b;
while (cin >> b && b != "#")
{
if (b == "+" || b == "-" || b == "*" || b == "/")
{
f.calculate(b[0]);
}
else
{
int num = stoi(b);
f.instack(num);
}
}
cout << f.showtop() << endl;
return 0;
}
整体还是很简单的,主要操作步骤如下
1.写一个栈的结构,这里面设置栈结构(a[]数组),index索引指向目前栈顶,并包含入栈、出栈、显示栈顶字符操作
2.输入字符
3.写运算calculate函数
要注意的问题是cin可以隔断输入的string b,此时比如单个输入的"11"就是要给字符串b
string b;
while (cin >> b && b != "#")
{
if (b == "+" || b == "-" || b == "*" || b == "/")
{
f.calculate(b[0]);
}
else
{
int num = stoi(b);
f.instack(num);
}
}
同时calculate()也可以用switch写,更简洁一些
void calculate(char k) {
int right = a[index--]; // 右操作数(栈顶)
int left = a[index--]; // 左操作数(次栈顶)
int sum = 0;
switch(k) {
case '+': sum = left + right; break;
case '-': sum = left - right; break;
case '*': sum = left * right; break;
case '/': sum = left / right; break; // 修正为 left / right
}
a[++index] = sum; // 结果入栈
}