前言:

  计算器的模拟实现主要分模式匹配式子解析两部分,本文主要针对后者进行分析并实现。

测试样例

1+2

3 * (4 + 5)

(4 + 5) / 3 + (1 + 2*1)

预计输出:

1+2 ==> 3
3 * (4 + 5) ==> 27
(4 + 5) / 3 + (1 + 2*1) ==> 6


分以下3个步骤:

  1)StringTokenizer切分单个字符;

2)根据计算的优先级,通过当前运算符判断是否进行运算操作;

(括号 > 乘除 > 加减)

3)两栈进行数字运算;

附Java代码:

package com.yeezhao.common.elt;import java.util.Stack;
import java.util.StringTokenizer;/*** 正整数计算器* * @author Administrator -> junhong* @since 2016年12月13日 下午1:22:40*/
public class CaculatorSimulate {private Stack<Character> operator = new Stack<>(); // 操作符private Stack<Integer> operand = new Stack<>(); // 操作数 0-9public void testCaculate() {}public void testOutput() {}/*** 返回计算结果* * @param exp*            正整数的加减乘除表达式* @return*/public Integer caculate(String exp) {if (exp == null || exp.isEmpty()) {System.out.println("invalid exp!");return 0;}StringTokenizer arr = new StringTokenizer(exp, "+-/*()", true);while (arr.hasMoreTokens()) {String text = arr.nextToken().trim();if (text.length() == 0) { // fix '(('continue;}char c = text.charAt(0);if (c == '+' || c == '-') {while (!operator.isEmpty() && ((operator.peek() == '+') || (operator.peek() == '-')|| (operator.peek() == '/') || (operator.peek() == '*'))) {oper(operator, operand);}operator.push(c);} else if (c == '/' || c == '*') {while (!operator.isEmpty() && ((operator.peek() == '/') || (operator.peek() == '*'))) {oper(operator, operand);}operator.push(c);} else if (c == '(') {operator.push(c);} else if (c == ')') {while (operator.peek() != '(') {oper(operator, operand);}operator.pop();} else {operand.push(Integer.parseInt(text));}}while (!operator.isEmpty()) {oper(operator, operand);;}return operand.pop();}public void oper(Stack<Character> operator, Stack<Integer> operand) {Integer num1 = operand.pop();Integer num2 = operand.pop();Character oper = operator.pop();Integer ret = 0;if (oper == '-')ret = num2 - num1;if (oper == '+')ret = num2 + num1;if (oper == '*')ret = num2 * num1;if (oper == '/') {if (num1 == 0) {System.out.println("'0' can not be divided!");} else {ret = num2 / num1;}}operand.push(ret);}public static void main(String[] args) {String[] exps = { "1+2", "3 * (4 + 5)", "(4 + 5) / 3 + (1 + 2*1)" };System.out.println("---***---");for (String exp : exps) {int ans = new CaculatorSimulate().caculate(exp);System.out.println(exp + " ==> " + ans);}}}

后记:

  加强版的计算器可增加如下内容:

  1.平方,根号等复杂运算

  2.正负数

  3.小数

后续有余力之时自当尽快补上!

转载于:https://www.cnblogs.com/SeaSky0606/p/6213642.html

【基础版】整数加减乘除计算器相关推荐

  1. 【基础版】大学计算机-计算思维导论

    超星尔雅[基础版]大学计算机-计算思维导论章节测验答案,下面就是按照章节顺序的题目 计算机.计算与计算思维 1[单选题]人类应具备的三大思维能力是指_____.答案:实验思维.理论思维和计算思维 A. ...

  2. 1350:面朝大海 春暖花开 [ 基础版 ]

    1350:面朝大海 春暖花开 [ 基础版 ] 难度: 倔强青铜    时间限制: 1000MS   空间限制: 64MB   提交数: 335   通过数: 27 题目描述: 选择那些大晴天的日子,行 ...

  3. 实验楼Java写计算器_Java版图形界面计算器

    Java 版图形界面计算器 实验说明及介绍 环境登录 无需密码自动登录,系统用户名 shiyanlou,密码 shiyanlou 环境介绍 本实验环境采用带桌面的 Ubuntu Linux 环境,实验 ...

  4. Java版图形界面计算器

    Java版图形界面计算器 1. 实验介绍 1. 实验内容 2. 实验知识点 3. 完整代码 2. 实验原理 3. 实验步骤 1. 项目创建 2. UI组件创建和初始化 3. 在窗口中添加 UI 组件 ...

  5. DIY 一个 Excel 版的子网计算器

    文章目录 Demo 计算函数 定版 获取 大家好,我是小弗.做网络规划时,需要用到子网划分:排查网络故障时,需要识别网段地址.处理步骤都是根据 IP 地址/网段和掩码,推算出子网地址.可用 IP 地址 ...

  6. java 模拟 电话本系统 (基础版)

    java 模拟 电话本系统 (基础版) 需求:注意的是,联系人的id是自增长的 实现的功能: java综合编程练习:基本的增删改查,对于逻辑数据的过滤,这块做了简单的处理,暂不优化 ContactPe ...

  7. java二个整数相减_Java-消息框显示两整数加减乘除

    //两个整数加减乘除 //Qi Ming Liu,October 7,2015 import javax.swing.JOptionPane; public class Calculater { pu ...

  8. spring boot构建基础版web项目(一)springboot、thymeleaf控制层基础构

    原文作者:弥诺R 原文地址:http://www.minuor.com/147852147/article 转载声明:转载请注明原文地址,注意版权维护,谢谢! 写前说明 根据个人在各篇博文中看到的信息 ...

  9. Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能  之前一直用的是自 ...

  10. 47. 对数组进行冒泡排序,实现冒泡排序的基础版与优化版

    //冒泡排序: //优化版口诀:序而不排 -> 优化原理:证实已经有序,不需要再次循环 -> 代码角度实现优化:内重循环已证实有序,外重循环不需要再次循环可以停止了.建立flag标记告诉外 ...

最新文章

  1. OpenCV+python:轮廓发现与对象测量
  2. linux apache 查看mpm 配置方式,Apache MPM模块prefork和worker的区别与配置
  3. ckeditor java 使用,CKEditor5在自定义数据处理器中使用模型
  4. 结构体前置申明未定义问题
  5. 机器人学习--Hans Moravec在斯坦福博士论文1980年-Obstacle Avoidance and Navigation in the Real World by a Seeing Ro
  6. 判断linux进程是否存在
  7. WordPress5.7版本下载及更新内容
  8. 打扰了!MacBook Pro 16英寸国行版正式开售:顶配46421元
  9. 计算机图形学实验报告百度云盘,计算机图形学实验报告(一).doc
  10. 汇编语言工具(DosBox、debug)下载与安装教程
  11. visual studio 显示行号
  12. List转Map的几种方式
  13. 自动驾驶测试中的场景构建
  14. 看懂Azure DevOps燃尽图(Burndown Chart)
  15. 形式验证 formality的设置及fm_shell使用
  16. ROCKET PROPULSION ELEMENTS——DEFINITIONS AND FUNDAMENTALS笔记
  17. PS如何批量处理图片大小
  18. CC26xx([CortexM3)的Power Reset and Clock
  19. Flink学习-DataStream-HDFSConnector(StreamingFileSink)
  20. bat批处理开发-wifi联网系列(5):wifi稳定性分析之日期时间比较及奇特数字的坑

热门文章

  1. JavaScript语法学习
  2. hyperledger fabric first network 只关闭停掉节点 不删除证书
  3. oracle怎么同步时间设置,【oracle数据库获取当前时间】
  4. php中session总结,PHP中SESSION使用中的一点经验总结
  5. 7-7 mmh学长的大数模板 (20分)
  6. EasyUI 收藏夹(私藏)
  7. CentOS 6.5 端口转发
  8. Spring Boot REST 请求(GetMapping,PostMapping)、格式化日期参数、压缩响应内容
  9. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_02-自定义查询页面-服务端-接口开发...
  10. ADO SQL手写分页