需要补全的代码如下

public int evaluate(String expr) {
int op1, op2, result = 0;
String token;
StringTokenizer tokenizer = new StringTokenizer(expr);
while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken(); //如果是运算符,调用isOperator
if () {
//从栈中弹出操作数2 //从栈中弹出操作数1 //根据运算符和两个操作数调用evalSingleOp计算result; //计算result入栈; } else//如果是操作数
//操作数入栈; } return result;
}

思路

  • 如果是运算符,调用isOperator

这是isOperator

private boolean isOperator(String token) {
return (token.equals("+") || token.equals("-") ||
token.equals("*") || token.equals("/"));
}

这个函数boolean 型,参数可以直接传字符串,所以在if() 中填入 isOperator(token)即可。

  • 从栈中弹出操作数2

弹栈使用stack.pop(),所以填入op2 = stackpop()

  • 从栈中弹出操作数1

方法同上。

  • 根据运算符和两个操作数调用evalSingleOp计算result

首先看下evalSingleOp以确定传入的参数

private int evalSingleOp(char operation, int op1, int op2)

那么,由上可以看出,需要传入char型运算符、int型操作数1、int型操作数2。operation就是运算符,需要传token,但是token是字符串,所以使用string.charAt(0),把token转换成token.charAt(0)。至于op1、op2本身就是int型。

综上得出,需要填入

result=evalSingleOp(token.charAt(0), op1, op2);

  • 计算result入栈

stack.push(result);

  • 如果是操作数,操作数入栈

这里只能让int型入栈,但是输入的token 是字符串,所以必须要使用Integer.parseInt(string) 转化成int型。

故填入

stack.push(Integer.parseInt(token));

完整代码

  • [git链接](

需要补全的代码如下

public int evaluate(String expr) {
int op1, op2, result = 0;
String token;
StringTokenizer tokenizer = new StringTokenizer(expr);
while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken(); //如果是运算符,调用isOperator
if () {
//从栈中弹出操作数2 //从栈中弹出操作数1 //根据运算符和两个操作数调用evalSingleOp计算result; //计算result入栈; } else//如果是操作数
//操作数入栈; } return result;
}

思路

  • 如果是运算符,调用isOperator

这是isOperator

private boolean isOperator(String token) {
return (token.equals("+") || token.equals("-") ||
token.equals("*") || token.equals("/"));
}

这个函数boolean 型,参数可以直接传字符串,所以在if() 中填入 isOperator(token)即可。

  • 从栈中弹出操作数2

弹栈使用stack.pop(),所以填入op2 = stackpop()

  • 从栈中弹出操作数1

方法同上。

  • 根据运算符和两个操作数调用evalSingleOp计算result

首先看下evalSingleOp以确定传入的参数

private int evalSingleOp(char operation, int op1, int op2)

那么,由上可以看出,需要传入char型运算符、int型操作数1、int型操作数2。operation就是运算符,需要传token,但是token是字符串,所以使用string.charAt(0),把token转换成token.charAt(0)。至于op1、op2本身就是int型。

综上得出,需要填入

result=evalSingleOp(token.charAt(0), op1, op2);

  • 计算result入栈

stack.push(result);

  • 如果是操作数,操作数入栈

这里只能让int型入栈,但是输入的token 是字符串,所以必须要使用Integer.parseInt(string) 转化成int型。

故填入

stack.push(Integer.parseInt(token));

完整代码

/**
* Created by radish608 on 17-5-3.
*/ import java.util.StringTokenizer;
import java.util.Stack; 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; 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(); //如果是运算符,调用isOperator
if (isOperator(token)) {
//从栈中弹出操作数2
op2 = stack.pop();
//从栈中弹出操作数1
op1 = stack.pop();
//根据运算符和两个操作数调用evalSingleOp计算result;
result=evalSingleOp(token.charAt(0), op1, op2);
//计算result入栈;
stack.push(result);
} else//如果是操作数
//操作数入栈;
stack.push(Integer.parseInt(token));
} 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;
}
}
  • MyDCTester

/**
* Created by radish608 on 17-5-3.
*/ import java.util.Scanner; public class MyDCTester { public static void main(String[] args) {
String expression, again; int result; try {
Scanner in = new Scanner(System.in); do {
MyDC evaluator = new MyDC();
System.out.println("Enter a valid postfix expression: ");
expression = in.nextLine(); result = evaluator.evaluate(expression);
System.out.println();
System.out.println("That expression equals " + result);
System.out.print("Evaluate another expression [Y/N]? ");
again = in.nextLine();
System.out.println();
}
while (again.equalsIgnoreCase("y"));
} catch (Exception IOException) {
System.out.println("Input exception reported");
}
}
}

运行结果

  • 用例:

1 2 + 8 2 - 7 4 - / *

  • 截图:

)

  • MyDC

/**
* Created by radish608 on 17-5-3.
*/ import java.util.StringTokenizer;
import java.util.Stack; 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; 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(); //如果是运算符,调用isOperator
if (isOperator(token)) {
//从栈中弹出操作数2
op2 = stack.pop();
//从栈中弹出操作数1
op1 = stack.pop();
//根据运算符和两个操作数调用evalSingleOp计算result;
result=evalSingleOp(token.charAt(0), op1, op2);
//计算result入栈;
stack.push(result);
} else//如果是操作数
//操作数入栈;
stack.push(Integer.parseInt(token));
} 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;
}
}
  • MyDCTester

/**
* Created by radish608 on 17-5-3.
*/ import java.util.Scanner; public class MyDCTester { public static void main(String[] args) {
String expression, again; int result; try {
Scanner in = new Scanner(System.in); do {
MyDC evaluator = new MyDC();
System.out.println("Enter a valid postfix expression: ");
expression = in.nextLine(); result = evaluator.evaluate(expression);
System.out.println();
System.out.println("That expression equals " + result);
System.out.print("Evaluate another expression [Y/N]? ");
again = in.nextLine();
System.out.println();
}
while (again.equalsIgnoreCase("y"));
} catch (Exception IOException) {
System.out.println("Input exception reported");
}
}
}

运行结果

  • 用例:

1 2 + 8 2 - 7 4 - / *

  • 截图:

MyDC总结的更多相关文章

  1. 20145234黄斐《Java程序设计》MyDC

    http://git.oschina.net/jiataiji/java

  2. NPOI Helper文档

    public class ExcelHelper { /// <summary> /// NPOI Excel转DataTable /// </summary> /// < ...

  3. C# csv 操作类

    using System.Data; using System.IO; using System.Text; namespace YanZhiwei.DotNet2.Utilities.Common ...

  4. python内建函数-数字相关

    本篇对于数字有关的内置函数进行总结. 数字包括 int() , long() , float() , complex() ,这些函数都能够用来进行数值类型的转换.同时这些函数也接受字符串参数,返回字符 ...

  5. wxWidgets学习笔记——在屏幕上画简单的图形和文字

    在屏幕上画简单图形和显示图片.处理简单鼠标键盘事件 /*************************************************************** * Name: M ...

  6. Installing vSphere SDK for Perl

    Installing vSphere SDK for Perl 你可以安装vSphere SDK 在Linux 或者Microsoft Windows 系统,或者 部署 VSphere Managem ...

  7. C#读取csv格式文件

    方法1:用一个System.Web.UI.HtmlControls.HtmlInputFile去handle文件选取 以下是button click event中的code,用来执行当文件选取了之后读 ...

  8. c# 柱状图(转载)

    // c# 显示柱状图 using System; using System.Data; using System.Configuration; using System.Web; using Sys ...

  9. 2016-2017-2 《Java 程序设计》课堂实践项目

    目录 基本工具 基础内容 Hello World 和 模块分解 数组的使用 命令行参数 递归 分支语句 String类的使用 类的定义与测试 多态 IO与异常 数据库 网络与安全 数据结构应用 And ...

随机推荐

  1. January 03 2017 Week 1st Tuesday

    It is always morning somewhere in the world. 世界上总是有一个地方可以看到阳光. There may be always someone who can e ...

  2. iPhone的设备名转换

    def convertDeviceName(self, deviceName): """ 转换deviceName(如iPhone 6,2)为用户习惯形式(如iPhone ...

  3. Phonegap 目录结构介绍

    1.Src 该目录包含了所有用户要创建的 Java 源文件 2.gen 为开发工具自动创建 3.assets 目录 用于方一些资源文件 css js html 4.res 目录该目录包含了所有的资源文 ...

  4. Java类修饰符的使用与作用以及常见问题

    首先明确,类是放在文件里的,在文件里面的不同位置就有不同的作用,就是不同类型的类. 1, 顶级类or外部类:包括两种,一个文件中与文件名同名称的类我们称作顶级类(也是外部类),如果在一个文件中的一个类 ...

  5. 死磕salt系列-salt入门

    saltstack简介 SaltStack是一种新型的基础设施管理软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位.SaltStack提供了一个动态基础 ...

  6. 消息中间件--"rocketmq"01之环境搭建

    前置知识 ssh工具 连接linux工具SecureCRT 颜色设置,参考 中文乱码,参考 Linux相关知识 centos7 防火墙firewalld的基本使用,参考 启动: systemctl s ...

  7. robotframwork接口测试(三)—HttpLibrary.HTTP安装

    1. 安装: 1)可以用命令:pip install robotframework-httplibrary(或pip install  --upgrade robotframework-httplib ...

  8. python3对数据库的基本操作

    其实Python同Java一样,都有对JDBC操作的API. 注意:我的Python版本为3.6.5 Python2.7是应用比较广的,百度博客上很多相关的例子,所以本次不再列出. 只要是用过Java ...

  9. QTP基本方法

    1.for循环: m代表间隔循环长度: 如果m>0,则j要大于i: 如果m<0,则i要大于j: for i to j [step m] 语句块 [exit for]//强制退出循环 nex ...

  10. ThinkPHP5入门(四)----模板篇

    一.模板访问 1.没有参数传递 $view = new View(); return $view->fetch(); 此时默认访问的模板路径为:[模板文件目录]/当前控制器名(小写+下划线)/当 ...