伪代码

public class MainTestwei
{
定义两个数组,List<Double> number和 List<Character>calculation分别用来装数字和 计算符
//与老师上课讲的入栈出栈差不多
public Count() {}方法初始化number和 calculation
public void init()方法清空数组
private boolean check()方法检查输入算式是否合法同时检查数字个数是否比计算符个数大1
private int findCount(String text, String regex, int len)方法返回输入的算式中匹配正则表达式得到元素的个数
private void setValue()给number和 calculation数组定初值(应用正则表达式)
private double sum()用case语句进行求值,注意*/在前+-在后
public String out(String text)判断是否合法,合法输出结果,不合法输出error
}

各个方法的依次实现

1.初始化number和 calculation

public Count() {
number = new ArrayList<>();
calculation = new ArrayList<>(); }

其中已经提前定义过

private List<Double> number;
private List<Character> calculation;
private String text;

即number是型的。calculation

是字符型的。

2.private int findCount(String text, String regex, int len)方法返回输入的算式中匹配正则表达式得到元素的个数。代码如下

 private int findCount(String text, String regex, int len) {
int count = 0;
Pattern compile = Pattern.compile(regex);
Matcher matcher = compile.matcher(text);
while (matcher.find()) {
count++;
if (len > 0) {//
System.out.println(matcher.group().length());
if (matcher.group().length() != len)//不理解matcher.group().length()
{
System.out.println(matcher.group().length());
return -1;
} }
}
return count;

其中

matcher.group().length()

是关于正则表达式中含有括号的个数。如

regex1 = "[+\-*/]+"它的matcher.group().length()即为1.因为中。间没有()分割。

regex = "\d+"它的matcher.group().length()也为1.

matcher.group()即为一次匹配得到的所有,不考虑括号()问题,而matcher.group(i)即为匹配第i个括号中所得到的表达式。

其中

if (len > 0) {//为什么
System.out.println(matcher.group().length());
if (matcher.group().length() != len)//不理解matcher.group().length()
{
return -1;
}

是为了避免式子中出现括号。

3.private boolean check()方法检查输入算式是否合法同时检查数字个数是否比计算符个数大1。

代码如下

private boolean check() {
if (text == null || !text.matches("[0-9+\\-*/]+"))//正则表达式不太理解
return false; String regex= "\\d+";
String regex1 = "[+\\-*/]+";
if (findCount(text, regex1, 1) == -1)
return false;
return findCount(text, regex1, 1) == findCount(text, regex, 0) - 1; }

regex是匹配数字用的正则表达式,regex1是匹配+ -/的正则表达式,而-/ 都需要转义,故在前面加上//。

如果出现括号则error,否则如果数字个数比字符个数多1,则正确,返回true。

4.private void setValue()给number和 calculation数组定初值(应用正则表达式),代码如下:

   private void setValue() {
Pattern compile = Pattern.compile("\\d+");
Matcher matcher = compile.matcher(text);
while (matcher.find()) {
number.add(Double.parseDouble(matcher.group()));
}
Pattern compile1 = Pattern.compile("[+-/*]");
Matcher matcher1 = compile1.matcher(text);
while (matcher1.find()) {
calculation.add(matcher1.group().charAt(0));
}
}

matcher.group()代表的就是匹配的内容,因为数字与字符交替排列,故每次add matcher.group()即可,转化为Double型。

5.private double sum()用case语句进行求值,注意*/在前+-在后。

代码如下:

private double sum() {

        for (int i = 0; i < calculation.size(); i++) {
char c = calculation.get(i);
switch (c) {
case '*':
number.set(i, number.get(i) * number.get(i + 1));
number.remove(i + 1);
calculation.remove(i);
i -= 1;//为什么要加i=i-1;
break;
case '/':
number.set(i, (Double) number.get(i) / number.get(i + 1));
number.remove(i + 1);
calculation.remove(i);
i -= 1;
break;
}
} for (int i = 0; i < calculation.size(); i++) {
char c = calculation.get(i);
switch (c) {
case '+':
number.set(i, number.get(i) + number.get(i + 1));
number.remove(i + 1);
calculation.remove(i);
i -= 1;
break;
case '-':
number.set(i, (Double) number.get(i) - number.get(i + 1));
number.remove(i + 1);
calculation.remove(i);
i -= 1;
break;
}
} return number.get(0);
}

其中为什么需要i=i-1?

因为上面有 for (int i = 0; i < calculation.size(); i++)循环,当你执行 calculation.remove(i);之后,i所指向的已经是下一个符号或者是数字了,但因为for循环仍然需要i++,故要提前把i-1。

此处与栈的操作类型有几分相似之处,再MyDC.java中,经过

while (tokenizer.hasMoreTokens()) //进行遍历
{
token = tokenizer.nextToken();
//token是单字符的字符串
//如果是运算符,调用isOperator
if (isOperator(token)==true) {
op2=stack.pop();
op1=stack.pop();
//从栈中弹出操作数2
//从栈中弹出操作数1
result=evalSingleOp(token.charAt(0),op1,op2);
//根据运算符和两个操作数调用evalSingleOp计算result;
stack.push(result);
//计算result入栈;
}
else//如果是操作数
{
stack.push(Integer.parseInt(token));//需要转化为int型
}
//操作数入栈;
}

6.public String out(String text)判断是否合法,合法输出结果,不合法输出error

代码如下

public String out(String text) {
init();
if (getString(text)) {
return sum() +"";//sum()为double类型,需要转化为字符串类型,则加上“”即可 } else {
return "error";
} }

其中init()用clear()方法即可。

最终代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class MainTest {
public static void main(String[] args) {
while (true) {
Scanner input = new Scanner(System.in);
String text = input.nextLine();
String string = new Count().out(text);
System.out.println(string);
} } } class Count {
private List<Double> number;
private List<Character> calculation;
private String text; public Count() {
number = new ArrayList<>();
calculation = new ArrayList<>(); } public String out(String text) {
init();
if (getString(text)) {
return sum() +""; } else {
return "error";
} } private double sum() { for (int i = 0; i < calculation.size(); i++) {
char c = calculation.get(i);
switch (c) {
case '*':
number.set(i, number.get(i) * number.get(i + 1));
number.remove(i + 1);
calculation.remove(i);
i -= 1;//为什么要加i=i-1;
break;
case '/':
number.set(i, (Double) number.get(i) / number.get(i + 1));
number.remove(i + 1);
calculation.remove(i);
i -= 1;
break;
}
} for (int i = 0; i < calculation.size(); i++) {
char c = calculation.get(i);
switch (c) {
case '+':
number.set(i, number.get(i) + number.get(i + 1));
number.remove(i + 1);
calculation.remove(i);
i -= 1;
break;
case '-':
number.set(i, (Double) number.get(i) - number.get(i + 1));
number.remove(i + 1);
calculation.remove(i);
i -= 1;
break;
}
} return number.get(0);
} public void init() {
number.clear();//清空数组
calculation.clear();
} public boolean getString(String text) {
this.text = text;
if (check()) { setValue();
return true;
}
return false;
} private void setValue() {
Pattern compile = Pattern.compile("\\d+");
Matcher matcher = compile.matcher(text);
while (matcher.find()) {
number.add(Double.parseDouble(matcher.group()));
}
Pattern compile1 = Pattern.compile("[+-/*]");
Matcher matcher1 = compile1.matcher(text);
while (matcher1.find()) {
calculation.add(matcher1.group().charAt(0));
}
} private boolean check() {
if (text == null || !text.matches("[0-9+\\-*/]+"))//正则表达式不太理解
return false; String regex = "\\d+";
String regex1 = "[+\\-*/]+";
if (findCount(text, regex1, 1) == -1)
return false;
return findCount(text, regex1, 1) == findCount(text, regex, 0) - 1; }
private int findCount(String text, String regex, int len) {
int count = 0;
Pattern compile = Pattern.compile(regex);
Matcher matcher = compile.matcher(text);
while (matcher.find()) {
count++;
if (len > 0) {//为什么
System.out.println(matcher.group().length());
if (matcher.group().length() != len)//不理解matcher.group().length()
{
return -1;
} }
}
return count;
} }

简易计算器的java实现的更多相关文章

  1. 《Java 程序设计》课堂实践项目-简易计算器

    <Java 程序设计>课堂实践项目简易计算器 课后学习总结 目录 改变 简易计算器实验要求 课堂实践成果 课后思考 改变 修改了博客整体布局,过去就贴个代码贴个图很草率,这次布局和内容都有 ...

  2. [java代码库]-简易计算器(第二种)

    [java代码库]-简易计算器(第二种) 第二种方案:在程序中不使用if/switch……case等语句,完成计算器功能. <html> <head> <title> ...

  3. Java通过循环结构和switch实现简易计算器

    Java通过循环结构和switch实现简易计算器 可以循环计算,通过调用函数本身来实现重新计算 package com.shenxiaoyu.method; import java.util.Scan ...

  4. Java方法:练习,控制台简易计算器

    可以更改计算个数的简易计算器 package com.zdz.method; import java.util.Scanner; public class Operator { public stat ...

  5. 如何使用Java AWT 创建一个简易计算器

    摘要:手把手教你使用 Java AWT 创建一个简易计算器. 本文分享自华为云社区<手把手教你使用 Java AWT 创建一个简易计算器>,作者:海拥 . 关于AWT AWT (抽象窗口工 ...

  6. [java代码库]-简易计算器(第一种)

    简易计算器(效果如图所示) 第一种方案:采用Javascript+html完成计算器,支持+-*/,结果显示不允许使用input输入域(可以考虑使用<span>) <html> ...

  7. 科学计算器的Java实现

    简易的科学计算器的实现 ---Java版 import javax.swing.*;//新的窗口组件包 import java.awt.*; import java.awt.event.*; publ ...

  8. 菜鸟学习Struts——简易计算器

    这是学习Struts的一个简单的例子文件结构如下: 1.配置Struts环境 2.新建input.jsp,success.jsp,error.jsp input.jsp代码如下: <%@ pag ...

  9. 使用HTML+CSS,jQuery编写的简易计算器

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

随机推荐

  1. xmanager运行报错:bash: /usr/bin/xterm: No such file or directory

    1.原因 xterm没有安装,解决办法是下载然后安装即可. 如果机器可以用yum,则直接使用yum安装xterm即可: yum install -y xterm 如果没有网络,则在某台操作系统大版本相 ...

  2. burpsuite拦截https数据包(Firefox)

    1.配置浏览器对http/https都使用burpsuite代理 http和https是分开的,对http使用了代理并不代表对https也使用了代理,要配置浏览器让其对https也使用同样的代理. 当 ...

  3. 牛客网 PAT 算法历年真题 1011 : 个位数统计 (15)

    个位数统计 (15) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定一个k位整数N = dk-1*10k- ...

  4. AI工具(矩形工具)(椭圆工具的操作与矩形类似)(剪切蒙版)5.11

    矩形工具:按住SHIFT键,可以绘制一个正方形. 按住ALT键,可以绘制以落点为中心的矩形. 同时按住SHIFT和ALT键可以绘制以鼠标落点为中心的正方形. 选择矩形工具,点击页面,输入高宽,精确绘制 ...

  5. Win10系列:JavaScript 数据绑定

    使用数据绑定可以使页面中元素的属性值与数据源中的数据同步,其中数据源可以来自数据库.文件以及自定义的数据等.在常用的数据绑定方法中,简单对象绑定是将HTML元素与一个仅包含数据的简单对象相绑定,模板绑 ...

  6. C++ 解析一

    C++ 类和对象C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计.类是 C++ 的核心特性,通常被称为用户定义的类型.类用于指定对象的形式,它包含了数据表示法和用于处理数据 ...

  7. shlve 模块

    shlve 模块  也用于序列化 它与pickle 不同之处在于 不需要惯性文件模式什么的 直接把它当成一个字典来看待 它可以直接对数据进行修改 而不用覆盖原来的数据 而pickle 你想要修改只能 ...

  8. cocos2d方块方块

    cGridSize=32 cSceneWidth=8+2 cSceneHeight=18 fuction Grid2Pos(x,y) local visibleSize=cc.Director:get ...

  9. Linux命令----su(切换用户)以及passwd(修改用户密码)

    一.su命令登录root 用户在使用telnet命令可以远程登录,但不可以登录root,这样就需要使用su命令来登录root用户. telnet登录(不能登录root)--- 1.启动终端 输入 te ...

  10. C数据结构 : 线性表 与 链表

    一.线性表 一般表现为数组,使用一组地址连续的存储单元依次存储数据元素,如图: 它具有如下特点: 长度固定,必须在分配内存之前确定数组的长度. 存储空间连续,即允许元素的随机访问. 存储密度大,内存中 ...