目录
项目3:算术表达式求解
一.问题分析和任务定义
(1)实现简单四则运算:加、减、乘、除;
(2)实现从左到右,按照优先次序一次计算;
计算次序:括号内优先计算;
相关运算符计算次序;
二.逻辑设计
(1)设计字符栈和数字栈,用于存放运算符和数字;
(2)检查输入表达式是否合理;
(3)将中缀表达式变换为后缀表达式;
ADT 简易计算器
Operation:
检查表达式是否合理
输入:字符串型表达式
功能:检验表达式合理性,若不合理,输入无效
输出:无
括号匹配
输入:无
功能:检查左右括号是否匹配,若括号不匹配,则抛出错误
输出:无
运算符优先级判断
输入:符号栈外运算符
功能:若栈外运算符优先级比栈顶运算符优先级低或平级,栈顶运算符要出栈执行计算,否则压栈
输出:无
表达式计算
输入:无
功能:取数字栈栈顶两个元素与符号栈栈顶运算符执行计算
输出:计算结果
endADT
三.物理设计
存储结构
开辟两个栈作为存储结构,分别存储表达式中的数字和运算符
函数设计
(1)检验表达式是否合理
伪代码:
暂存当前表达式;
判断是否为空;
为空则装入下一个字符;
不为空则要判断装入下一个字符是否逻辑错误;
(2)括号匹配
// 括号匹配函数
boolean BracketMatch(String s) {
CharStack S = new CharStack();
int ptr = 0;
while (ptr != s.length()) {//遍历算术表达式
if (s.charAt(ptr) == '(')// 返回 char指定索引处(ptr)的值。
{
S.Push(s.charAt(ptr));
ptr++;
} else if (s.charAt(ptr) == ')') {
if (S.Empty()) {//未匹配到左括号
return false;
} else {
S.Pop();
ptr++;
}
} else {
ptr++;
}
}
return S.Empty();
}
(3)运算符优先级判断
public boolean InOut(char a, char b)//a为符号栈栈顶元素,b为待插入的元素
{
boolean i = true;//i=true入栈,i=false弹出操作符以及操作数进行计算
if ((a == '+' || a == '-') && (b == '*' || b == '/')) i = true;
if ((a == '+' || a == '-') && (b == '+' || b == '-')) i = false;
if ((a == '*' || a == '/') && (b == '*' || b == '/')) i = false;
if ((a == '*' || a == '/') && (b == '+' || b == '-')) i = false;
if (a == '(') i = true;
return i;
}
(4)计算表达式
伪代码:
遇到加减乘除运算符时取出数字栈内栈顶两个元素与符号栈栈顶元素计算,并将结果压入数字栈;
遇到等于号时输出结果
结构框架
四.测试数据
(30+2*70)/3-12*3
5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行
测试结果