需要补全的代码如下

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. 为Linux设置IPTables防火墙

    我们 来讨论一下如何为你的CentOS 服务器来设置简单的防火墙. 这里我们以DigitalOcean的CentOS 6 VPS为基础来讨论的,同样也适用于 阿里云上其他类型的LINUX系统. (阿里 ...

  2. System.Buffer 以字节数组(Byte[])操作基元类型数据

    1. Buffer.ByteLength:计算基元类型数组累计有多少字节组成. 该方法结果等于"基元类型字节长度 * 数组长度" , , }; , , }; , , }; Cons ...

  3. 安装visual studio2017后 首次启动出现ActivityLog.xml异常解决方法

    安装visual studio2017后 首次启动出现ActivityLog.xml异常解决方法 ps:操作系统是win10 在官网下载了vs2017社区版按照教程(教程链接在文末)安装完成之后,首次 ...

  4. wooyun内网渗透教学分享之内网信息探测和后渗透准备

    常规的,从web业务撕开口子url:bit.tcl.comgetshell很简单,phpcms的,一个Phpcms V9 uc api SQL的老洞直接getshell,拿到shell,权限很高,sy ...

  5. AESUtil 加密

    package com.hxqc.basic.dependency.util; import org.apache.commons.lang.StringUtils; import sun.misc. ...

  6. BZOJ4987:Tree(树形DP)

    Description 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一行两个正整数n,k,表示数的顶点数和需要 ...

  7. 1、RabbitMQ入门

    RabbitMQ 可以参考官网进行学习! 开发语言:Erlang – 面向并发的编程语言. AMQP:是消息队列的一个协议. mysql 是 java 写的吗?不是 那么 java 能不能访问?可以, ...

  8. 《metasploit渗透测试魔鬼训练营》学习笔记第九章--meterpreter

    七.强大的meterpreter  7.1再探metasploit的攻击载荷模块     7.1.1典型的攻击载荷模块     metasploit涵盖了各大主流操作系统和平台,其中绝大部分是远程漏洞 ...

  9. 【转】Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何使用Maven来搭建Spring+Mybatis+SpringMVC+M ...

  10. JNI由浅入深_9_JNI 异常处理

    1 .本地代码中如何缓存和抛出异常 下面的代码中演示了如何声明一个会抛出异常的本地方法.CatchThrow这个类声明了一个会抛出IllegalArgumentException异常的名叫doit的本 ...