一、需求分析
【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)。
二、逻辑设计
程序主要执行框架如下
其他类{
操作数栈{
}
操作字符栈{
}
操作字符集合{
}
获取优先级{
()
* /
+ -
}
中缀转后缀{
}
处理负号{
}
取()中间的数字{
}
}
主类{
Main函数{
Menu菜单
}
}
三、物理设计
用栈实现中缀表达式转换成后缀表达式
// 中缀转后缀
private static String infixToSuffix(String expression) throws Exception {
Operators = new Stack<>();
Operators.clear();
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < expression.length(); i++) {
char ch = expression.charAt(i);
if (ch == ' ')
continue;
if (C_OperatorSet.contains(ch)) {
// 如果操作符栈为空
if (Operators.empty()) {
if (ch == ')') { // 只要不是 ) 就入栈
throw new Exception("表达式错误");
// System.out.println("括号不匹配");
// return sBuilder.toString();
}
Operators.push(ch);
} else if (ch == '(') {
Operators.push(ch);
} else if (ch == ')') { // 如果是 ) 括号
char top;
while ((top = (char) Operators.peek()) != '(') { // 如果当前操作符栈的第一个不是(
if (Operators.empty()) {
// System.out.println("括号不匹配");
// return sBuilder.toString();
throw new Exception("表达式错误");
}
// 把运算符加入sBuilder
sBuilder.append(top);
Operators.pop();
}
Operators.pop();
} else { // 如果是运算符
char top = (char) Operators.peek();
if (getOperatorPriority(ch) <= getOperatorPriority(top)) { // 如果优先级小于操作符栈中第一个
while (!Operators.empty()
&& getOperatorPriority(ch) <= getOperatorPriority(top = (char) Operators.peek())) {
// 把运算符加入sBuilder
sBuilder.append(top);
Operators.pop();
}
}
Operators.push(ch);
}
} else { // 如果是数字 加入sBuilder(把[3]的括号去除)
sBuilder.append("[" + ch);
while (i + 1 < expression.length()
&& (((ch = expression.charAt(i + 1)) == '.') || (ch >= '0' && ch <= '9'))) {
sBuilder.append(ch);
++i;
}
sBuilder.append(']');
}
}
while (!Operators.empty()) {
if ((char) Operators.peek() == '(') {
throw new Exception("表达式错误");
// System.out.println("括号不匹配");
// return "";
}
sBuilder.append(Operators.peek());
Operators.pop();
}
return sBuilder.toString();
}
算法框架如上,实际开发可能会有所改动
四、实验准备
1.编程语言
java
2.开发工具/平台
IDEA