需要补全的代码如下

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. Eclipse+Maven 项目创建

    ★:jar包下载不了的话可能是镜像里没有这个版本,换个低版本的就行 ★:eclipse工程validating很慢,可以先关掉验证(一般对项目没什么影响) ★:eclipse工程pom.xml文件报错 ...

  2. 如何用iOS工程生成iOS模拟器包

    1. 在终端上运行下面的命令来查找你的机器上可用的SDK的版本 xcodebuild -showsdks 2. 创建模拟器包: xcodebuild -workspace ** -scheme ** ...

  3. TCP/IP 协议图--传输层中的 TCP 和 UDP

    TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP. TCP 是面向连接的.可靠的流协议.流就是指不间断的数据结构,当应用程序采用 TCP 发送消息时,虽然可以保证发送的顺序,但 ...

  4. [零基础学JAVA]Java SE面向对象部分.面向对象基础(06)

    1.interface 接口 2.设计模式(工厂模式) 3.异常的捕获 java: //接口中定义的全是public,即使不声明也是public的,//如果一个类定义的时候全部由抽象方法和全局常量所组 ...

  5. Jarsigner签名使用

    转载请标明出处: http://www.cnblogs.com/why168888/p/6548544.html 本文出自:[Edwin博客园] 如何签名: jarsgner-verbose-keys ...

  6. iOS js 使用与JSContext

    JSContext:js执行环境,包含了js执行时所需要的所有函数和对象: js执行时,会在执行环境搜索需要的函数然后执行,或者保存传入的变量或函数: JSContext *jsContext = [ ...

  7. [SHOI2010]最小生成树

    题目 首先让其余所有边都减\(1\)和让自己加\(1\)没什么区别 考虑\(kruskal\)的过程 首先边权大于这条边的是不用考虑的 考虑把那些边权比这条边小的调节到比这条边大,这样就相当于在生成树 ...

  8. sprintf格式化字符串安全问题

    先看sprintf用法: 定义和用法 sprintf() 函数把格式化的字符串写入变量中. arg1.arg2.++ 参数将被插入到主字符串中的百分号(%)符号处.该函数是逐步执行的.在第一个 % 符 ...

  9. programming-languages学习

    programming-languages学习 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {backg ...

  10. 链表推导式 【list comprehension】

    x for x in x 链表推导式 [list comprehension]链表推导式提供了一个创建链表的简单途径,无需使用 map(), filter() 以及 lambda.返回链表的定义通常要 ...