【基础版】整数加减乘除计算器
前言:
计算器的模拟实现主要分模式匹配和式子解析两部分,本文主要针对后者进行分析并实现。
测试样例:
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[单选题]人类应具备的三大思维能力是指_____.答案:实验思维.理论思维和计算思维 A. ...
- 1350:面朝大海 春暖花开 [ 基础版 ]
1350:面朝大海 春暖花开 [ 基础版 ] 难度: 倔强青铜 时间限制: 1000MS 空间限制: 64MB 提交数: 335 通过数: 27 题目描述: 选择那些大晴天的日子,行 ...
- 实验楼Java写计算器_Java版图形界面计算器
Java 版图形界面计算器 实验说明及介绍 环境登录 无需密码自动登录,系统用户名 shiyanlou,密码 shiyanlou 环境介绍 本实验环境采用带桌面的 Ubuntu Linux 环境,实验 ...
- Java版图形界面计算器
Java版图形界面计算器 1. 实验介绍 1. 实验内容 2. 实验知识点 3. 完整代码 2. 实验原理 3. 实验步骤 1. 项目创建 2. UI组件创建和初始化 3. 在窗口中添加 UI 组件 ...
- DIY 一个 Excel 版的子网计算器
文章目录 Demo 计算函数 定版 获取 大家好,我是小弗.做网络规划时,需要用到子网划分:排查网络故障时,需要识别网段地址.处理步骤都是根据 IP 地址/网段和掩码,推算出子网地址.可用 IP 地址 ...
- java 模拟 电话本系统 (基础版)
java 模拟 电话本系统 (基础版) 需求:注意的是,联系人的id是自增长的 实现的功能: java综合编程练习:基本的增删改查,对于逻辑数据的过滤,这块做了简单的处理,暂不优化 ContactPe ...
- java二个整数相减_Java-消息框显示两整数加减乘除
//两个整数加减乘除 //Qi Ming Liu,October 7,2015 import javax.swing.JOptionPane; public class Calculater { pu ...
- spring boot构建基础版web项目(一)springboot、thymeleaf控制层基础构
原文作者:弥诺R 原文地址:http://www.minuor.com/147852147/article 转载声明:转载请注明原文地址,注意版权维护,谢谢! 写前说明 根据个人在各篇博文中看到的信息 ...
- Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版
2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能 之前一直用的是自 ...
- 47. 对数组进行冒泡排序,实现冒泡排序的基础版与优化版
//冒泡排序: //优化版口诀:序而不排 -> 优化原理:证实已经有序,不需要再次循环 -> 代码角度实现优化:内重循环已证实有序,外重循环不需要再次循环可以停止了.建立flag标记告诉外 ...
最新文章
- OpenCV+python:轮廓发现与对象测量
- linux apache 查看mpm 配置方式,Apache MPM模块prefork和worker的区别与配置
- ckeditor java 使用,CKEditor5在自定义数据处理器中使用模型
- 结构体前置申明未定义问题
- 机器人学习--Hans Moravec在斯坦福博士论文1980年-Obstacle Avoidance and Navigation in the Real World by a Seeing Ro
- 判断linux进程是否存在
- WordPress5.7版本下载及更新内容
- 打扰了!MacBook Pro 16英寸国行版正式开售:顶配46421元
- 计算机图形学实验报告百度云盘,计算机图形学实验报告(一).doc
- 汇编语言工具(DosBox、debug)下载与安装教程
- visual studio 显示行号
- List转Map的几种方式
- 自动驾驶测试中的场景构建
- 看懂Azure DevOps燃尽图(Burndown Chart)
- 形式验证 formality的设置及fm_shell使用
- ROCKET PROPULSION ELEMENTS——DEFINITIONS AND FUNDAMENTALS笔记
- PS如何批量处理图片大小
- CC26xx([CortexM3)的Power Reset and Clock
- Flink学习-DataStream-HDFSConnector(StreamingFileSink)
- bat批处理开发-wifi联网系列(5):wifi稳定性分析之日期时间比较及奇特数字的坑
热门文章
- JavaScript语法学习
- hyperledger fabric first network 只关闭停掉节点 不删除证书
- oracle怎么同步时间设置,【oracle数据库获取当前时间】
- php中session总结,PHP中SESSION使用中的一点经验总结
- 7-7 mmh学长的大数模板 (20分)
- EasyUI 收藏夹(私藏)
- CentOS 6.5 端口转发
- Spring Boot REST 请求(GetMapping,PostMapping)、格式化日期参数、压缩响应内容
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_02-自定义查询页面-服务端-接口开发...
- ADO SQL手写分页