利用栈和队列进行表达式求值
一、实验目的
深入了解栈和队列的特性,学会在实际问题下灵活运用它们。
二、问题描述
表达式求值运算是实现程序设计语言的基本问题之一,也是栈应用的一个典型例子。设计并演示用算符优先级对算术表达式的求解过程。
三、实验要求
1、算法优先级别如下:
2、以字符序列的形式从终端输入语法正确、不含变量的算术表达式,利用给出的算符优先级关系,实现对算术四则混合运算的求解过程。
四、实验环境
PC微机
DOS操作系统或 Windows 操作系统
Turbo C 程序集成环境或 Visual C++ 程序集成环境
五、实验步骤
1、根据给出的算符优先级,设置运算符栈和运算数栈;
2、在读入表达式的同时,完成运算符和运算数的识别处理,并将运算数的字符序列形式转换成整数形式,并进行相应的运算;
3、调试程序,检查输出结果;
4、实验小结。
六、测试数据
1.输入数据:1+(20+4)/(4-1)
正确结果:9
2.输入数据:2*9-6-(20+4)/(4-1)
正确结果:4
七、实验报告要求
1、问题描述;
2、算法的设计描述;
3、测试结果的分析与讨论;
4、实现算法的程序清单,应有足够的注释。
八、程序代码
#include <iostream>
using namespace std;
#include <stack>
typedef bool status;
constexpr auto ok = 1;
constexpr auto error = 0;
stack<double>OperandsOriginal;
stack<char> OperatorOriginal;
stack<double>Operands;
stack<char> Operator;
void Calculation();
char number(char a) {
double opead = 0;
opead = (opead + int(a) - 48) * 10;
while (1) {
cin >> a;
if (a < 48 || a > 58) {
opead /= 10;
OperandsOriginal.push(opead);
return a;
}
opead = (opead + int(a) - 48) * 10;
}
}
status Expression_input() {
char a;
while (1) {
cin >> a;
if (a > 47 && a < 58)
a = number(a);
if (a == '=') {
return ok;
}
else if (a == '+' || a == '-' || a == '*' || a == '/' || a == '(' || a == ')') {
OperatorOriginal.push(a);
return 0;
}
}