佛山小网站建设抖音排名优化
栈的应用【实验题】
使用栈实现后缀表达式计算,其中,在后缀表达式中,输入的数字为整数,且为正数,数字、符号之间用空格隔开,整个后缀表达式用“#”表示结束。其中,整个后缀表达式长度不超过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; // 结果入栈}