数据结构项目三
项目三
- 一、需求分析
- 二、逻辑设计
- 三、物理设计
- 四、实验准备
-
- 1.编程语言
- 2.开发工具/平台
一、需求分析
【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)。
二、逻辑设计
程序主要执行框架如下
其他类{操作数栈{}操作字符栈{}操作字符集合{}获取优先级{()* /+ -}中缀转后缀{}处理负号{}取()中间的数字{}}主类{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("表达式错误");}// 把运算符加入sBuildersBuilder.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())) {// 把运算符加入sBuildersBuilder.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