您的位置:首页 > 运维架构 > Linux

实现Linux下dc的功能,计算后缀表达式的值

2017-05-31 18:25 447 查看

提交测试截图和码云练习项目链接,实现Linux下dc的功能,计算后缀表达式的值

-将运算符写在两个操作数之后的表达式称为“后缀表达式”,如上面的中缀表达式可转换为后缀表达式1 2 3 4 - * + 5 +。后缀表达式中没有括号,而且运算符没有优先级。后缀表达式的求值过程能够严格地从左到右按顺序进行,符合运算器的求值规律。

应注意的问题;

-老师主要是想考察课上是否听懂了,并且检验我们的实际动手编程能力。

在课堂是是听懂了老师所说的课程,虽然没有编写出相应的代码,但也回来及时将博客补上,并且对代码进行了了解。

-优先级问题;

-入栈,出栈顺序参考PPT

老师给出的代码(不完整)

mport 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 () {
//从栈中弹出操作数2

//从栈中弹出操作数1

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

//计算result入栈;

} else//如果是操作数
stack.push(new Integer(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

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");
}
}
}

dc

dc 命令是一个任意精度的算术计算器。dc 命令从 File 参数或者标准输入得到其输入直到它读到一个文件结束符。一旦 dc 命令接收到输入,它将求出计算值并将计算值写入到标准输出当中。它按十进制整数计算,但是您可以指定输入和输出的基数,以及小数部分保留的位数。dc 命令结构如同一个堆栈、逆波兰表示法计算。

考点:
考课堂上刚讲的入栈和弹栈

补充代码如下

while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken();
//如果是运算符,调用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));
}
//操作数入栈;
}

运行结果:



码云链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: