数据结构课程设计:算术表达式求解

目录

项目3:算术表达式求解

一.问题分析和任务定义

二.逻辑设计

三.物理设计

存储结构

函数设计

结构框架

 四.测试数据

测试结果


项目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
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行

测试结果

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值