1.3.1 题目内容
1.3.1-A [问题描述]
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正实数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#6+15*(21-8/4)#。引入表达式起始、结束符是为了方便。编程利用“运算符优先法”求算术表达式的值。
1.3.1-B [基本要求]
(1) 从键盘或文件读入一个合法的算术表达式,输出正确的结果。
(2) 显示输入序列和栈的变化过程。
(3) 考虑算法的健壮性,当表达式错误时,要给出错误原因的提示。
(4) 实现非整数的处理(*)。
1.3.2 算法思想
本题创建两个栈:一个用于存储数字(nums),一个用于存储运算符(ops)。首先读入用户输入的算术表达式,并判断起始和结束符是否为"#"。然后遍历表达式中的每个字符:1,如果是数字或小数点,将其添加到字符串numStr中,以便后续转换为实际数字。2,如果是空格,则忽略。如果是左括号"(",直接将其压入运算符栈ops中。3,如果是右括号")",则执行相应的计算操作,直到栈顶元素是左括号为止。4,如果是运算符,则通过precedence函数判断符号的优先级,如果栈顶运算符的优先级大于等于当前运算符的优先级,则执行相应的计算操作,直到栈顶运算符的优先级小于当前运算符的优先级或栈为空。通过calculate函数实现计算操作,push函数将当前运算符压入运算符栈ops中。如果遍历完表达式后,数字字符串numStr非空,则将其转换为实际数字,并压入数字栈nums中。对剩余的运算符进行计算操作,直到运算符栈为空。返回数字栈nums的栈顶元素,即为表达式的最终结果。
在结果显示方面,为了实现良好交互的界面,通过Set_Color函数来控制字体颜色,其中,入栈显示为绿色,出栈显示为红色。
1.3.3 数据结构
存储相关信息的动态申请空间的栈,结构体申明如下:
1.3.3-A Stack
typedef struct Stack
{
// 栈顶指针
int top;
// 栈的容量
int capacity;
// 存储数据的数组
double* data;
}Stack;
1.3.5 测试数据与运行结果
1.3.5-A 测试数据
测试样例1:1+324
测试样例2:#4+7a+fs
测试样例3:#3.3+6/0+(2+1.9)*2#
测试样例4:#6+15*(21-8/4)#
源码地址:GeekclubC/Course-Design-of-Data-Structure: 用C++完成的数据结构课程设计 (github.com)