mini dc

任务内容

本次mini dc任务就是通过补充代码来实现整型数据的后缀表达式计算

相关知识

  • 通过利用堆栈这一先进后出的数据结构来实现后缀表达式的计算。通过Stack<Integer> stack建立一个为int类型的堆栈stack。可以使用stack.push();来进行压栈,stack.pop();来进行弹栈。
  • 通过调用private boolean isOperator (String token)来判断按空格标记分隔好的String数据是否为运算符。
  • 使用正则表达式“[0-9]+”来判断是否为字符整数类型。
  • StringTokenizer类是一种可以按不同的风格对String类型数据做分隔,有两种构造方法。StringTokenizer(String s),则按照空格,换行,Tab等符号来做分隔标记。StringTokenizer(String s,String delim)则按照delimit字符序列中的任意排列来作为分隔标记。

实现代码

import java.util.Stack;
import java.util.StringTokenizer;
import java.util.*;
public class MyDC
{
/** constant for addition symbol */
private final char ADD = '+';
/** constant for subtraction symbol */
private final char SUBTRACT = '-';
/** constant for multiplication symbol */
private final char MULTIPLY = '*';
/** constant for division symbol */
private final char DIVIDE = '/';
/** the stack */
private Stack<Integer> stack;
// MyDC my= new MyDC();
public MyDC() {
stack = new Stack<Integer>();
} public int evaluate (String expr)
{
int op1, op2, result = 0;
String token;
StringTokenizer tokenizer = new StringTokenizer (expr);
while (tokenizer.hasMoreTokens())
{
token = tokenizer.nextToken();
//System.out.println(token);
//如果是运算符,调用isOperator
if (isOperator(token))
{
char []c=token.toCharArray();
op1=stack.pop();
//从栈中弹出操作数2
op2=stack.pop();
//从栈中弹出操作数1
result=evalSingleOp(c[0],op1,op2);
//根据运算符和两个操作数调用evalSingleOp计算result;
stack.push(result);
//计算result入栈;
}
else{
//如果是操作数
if(token.matches("[0-9]+")) {
int number=Integer.parseInt(token);
stack.push(number);
}
}
}
return result;
} private boolean isOperator (String token)
{
return ( token.equals("+") || token.equals("-") ||
token.equals("*") || token.equals("/") );
} private int evalSingleOp (char operation, int op1, int op2)
{
int result = 0; switch (operation)
{
case ADD:
result = op1 + op2;
break;
case SUBTRACT:
result = op1 - op2;
break;
case MULTIPLY:
result = op1 * op2;
break;
case DIVIDE:
result = op1 / op2;
} return result;
}
}

代码运行截图

简易计算器

任务内容

实现一个简易计算器Calc,支持+ - x / %运算, 从命令行传入计算数据,Calc计算器可以进行简单的计算。

相关知识

  • 要使用到堆栈的一些基本知识,通过Stack<Integer> stack=new Stack<Integer>();来建立一个int数据类型的堆栈,来存放操作数,Stack<Character> stack1=new Stack<Character>();来建立一个char数据类型的堆栈来存放运算符。
  • 使用StringTokenizer fenxi=new StringTokenizer(str);来对输入的String类型的数据进行按空格进行做分隔。
  • 需要通过isOperator来判断是否为运算符,通过matches()和正则表达来判断是否为操作数。

实现过程

通过命令行传入String类型的数据,然后对传入的数据进行按空格做分隔标记,然后对分隔好的String数据类进行判断是否为运算符或操作数,如果是运算符则对运算符进行压栈(压入stack1),如果是操作数就i++,并且对操作数进行压栈(压入stacki++,当i=2时就说明stack栈中已经压入两个操作数,所以stack进行两次弹栈,stack1进行一次弹栈,然后调用函数int evalSingleOp (char operation, int op1, int op2);来计算结果,最后将结果返回。

实现代码

import java.io.IOException;
import java.util.*;
public class CalczOperator {
/** constant for addition symbol */
private final char ADD = '+';
/** constant for subtraction symbol */
private final char SUBTRACT = '-';
/** constant for multiplication symbol */
private final char MULTIPLY = 'x';
/** constant for division symbol */
private final char DIVIDE = '/';
/** constant for MOD symbol */
private final char MOD = '%';
/** the stack */
Stack<Integer> stack=new Stack<Integer>();
Stack<Character> stack1=new Stack<Character>();
int operate(String str)throws IOException {
int op1,op2,result=0;
int i=0;
String string;
StringTokenizer fenxi=new StringTokenizer(str);
while (fenxi.hasMoreTokens())
{
string = fenxi.nextToken();
//如果是运算符,调用isOperator
if (isOperator(string))
{
char c[]=string.toCharArray();
stack1.push(c[0]);
}
else{
//如果是操作数
if(string.matches("[0-9]+")) {
i++;
int number=Integer.parseInt(string);
stack.push(number);
if(i==2){
op1=stack.pop();
op2=stack.pop();
result=result=evalSingleOp(stack1.pop(),op2,op1);
}
}
}
}
return result;
}
private int evalSingleOp (char operation, int op1, int op2)
{
int result = 0; switch (operation)
{
case ADD:
result = op1 + op2;
break;
case SUBTRACT:
result = op1 - op2;
break;
case MULTIPLY:
result = op1 * op2;
break;
case DIVIDE:
result = op1 / op2;
break;
case MOD:
result = op1 % op2;
break;
} return result;
}
private boolean isOperator (String token)
{
return ( token.equals("+") || token.equals("-") ||
token.equals("x") || token.equals("/") ||token.equals("%"));
} }
import java.io.IOException;
public class Calc {
public static void main (String args[]){
try {
CalczOperator calczoperator = new CalczOperator();
String[] prt = new String[args.length];
for(int i =0;i<args.length;i++){
prt[i] = args[i];
}
String str = prt[0]+" "+prt[1]+" "+prt[2]
int result = calczoperator.operate(str);
System.out.println(str + " = " + result);
}
catch (IOException e){
System.out.println("error");
}
}
}

代码运行截图:

遇到的问题以及解决过程

当运行代码java Calc 3 * 2,时报错,对其他的运算符都能正常运行出结果,只有*运算符不可以,我在UbuntuWindows的命令行中都运行了一遍,但都会报错。



我通过JDB调试,print args[]中的数值时,args[1]args[2]的数据出错。

所以我认为传入的数据中含有*的原因,所以我用x代替了*进行传值。最后结果正常。

代码链接

心得体会

在做简易计算器和mini dc程序时,主要是对堆栈这一数据结构的灵活使用,以后多多练习,可以写出四则混合运算,把计算优先级考虑进去。

mini dc与简易计算器 20165235的更多相关文章

  1. 课堂限时训练-简易计算器·mini dc

    课堂限时训练-简易计算器·mini dc 实验题目 采用后缀表达式法,设计一个建议计算器,实现+.-.*./四种运算. 代码实现 码云链接 关键代码部分及结果如下: 实验分析 首先,分析一下后缀表达式 ...

  2. 自制c#简易计算器

    这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...

  3. 剖析简易计算器带你入门微信小程序开发

    写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...

  4. PHP学习笔记02——简易计算器

    <!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...

  5. JavaScript之简易计算器

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

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

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

  7. Python之实现一个简易计算器

    自己动手写计算器 一.功能分析 用户输入一个类似这样 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 这样的表达式,假设表达式里 ...

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

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

  9. 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)

    之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...

随机推荐

  1. 将list集合转json

    public static class DataHelper { /// /// js 序列化器 /// static JavaScriptSerializer jss = new JavaScrip ...

  2. 2018 github热门项目

    github流行的几个项目,我们来学习一下. 1. developer-roadmap-chinese image.png 项目简介:2018年web程序员路线中文版, 这个仓库里包含了一些前端,后端 ...

  3. Ubuntu16.04配置Tomcat的80端口访问

    [问题描述] 在阿里云 ECS 服务器 Ubuntu16.04 下部署 Java Web 应用时,发现配置的 Tomcat 服务启动后 80 端口无法被监听. [问题原因] 出现该问题的主要原因是:非 ...

  4. Confluence 6 安装补丁类文件

    Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中.这些问题将会使用 Class 类文件同时在官方 J ...

  5. Django项目的创建及基本使用

    安装步骤 Django是Python进行Web开发的框架,目前应用比较广泛.使用python进行Web开发,能够很快的搭建所需的项目,可以运用于原型开发,也可以部署到实际的应用环境. 使用Django ...

  6. laravel 路由模型绑定

    我们在使用路由的时候一个很常见的使用场景就是根据资源 ID 查询资源信息: Route::get('task/{id}', function ($id) { $task = \App\Models\T ...

  7. tail -f -n 0 /var/log/messages

    <pre><font color="#CC0000"><b>root@kali</b></font>:<font ...

  8. numpy 与 pandas

    numpy: import numpy as np np.array([1,2,3]) 创建数组 np.arange(10).reshape(2,5) 类似于range(起始,终止,步长),可以加re ...

  9. PHP编译安装时常见错误解决办法

    转载自:http://www.bkjia.com/PHPjc/1008013.html This article is post on https://coderwall.com/p/ggmpfa c ...

  10. 流媒体服务器SRS部署

    github地址:https://github.com/ossrs/srs 1,srs下载 http://ossrs.net/srs.release/releases/index.html 选择正式发 ...