初学java,求助。

小一郎 2010-05-30 10:03:29

写了个简单的中缀表达式求值,一直调不过,麻烦各位大侠帮忙指正,代码如下

目标输入:(1+2)* 3 + (5/1)
目标输出: 14

package simplecomputer;

import java.util.Scanner;
import java.util.Stack;

public class Caculator
{
public String compute(String expression)
{
String exp = expression.trim();
char[] strs = exp.toCharArray();

Stack<String> operatorStack = new Stack<String>();
Stack<String> valueStack = new Stack<String>();

String topOperator = "";
String operandOne = "";
String operandTwo = "";

Double result = new Double(0.0);

for (int i = 0; i < strs.length; i++)
{
String pointer = String.valueOf(strs[i]);
Character next = new Character(pointer.charAt(0));

switch (next)
{
case '+':case '-':case '*':case '/':
if(operatorStack.isEmpty())
{
operatorStack.push(pointer);
}
else
{
topOperator = operatorStack.peek();
Character a = topOperator.charAt(0);
while (priority(next) <= priority(a))
{
topOperator = operatorStack.pop();
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
Double num1 = Double.parseDouble(operandOne);
Double num2 = Double.parseDouble(operandTwo);
result = calculate(topOperator,num1, num2);
valueStack.push(result.toString());
}
operatorStack.push(pointer);
}
break;

case '(':
operatorStack.push(pointer);
break;

case ')':
topOperator = operatorStack.pop();
while(topOperator != "(")
{
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
Double num1 = Double.parseDouble(operandOne);
Double num2 = Double.parseDouble(operandTwo);
result = calculate(topOperator,num1, num2);
valueStack.push(result.toString());

topOperator = operatorStack.pop();
}
break;
default:
if (Character.isDigit(next))
{
valueStack.push(pointer);
}
else
{
System.out.println("表达式输入错误");
}
break;
}
}

while (!operatorStack.isEmpty())
{
System.out.println(valueStack);
System.out.println(operatorStack);

topOperator = operatorStack.pop();
operandTwo = valueStack.pop();
operandOne = valueStack.pop();
Double num1 = Double.parseDouble(operandOne);
Double num2 = Double.parseDouble(operandTwo);
result = calculate(topOperator,num1, num2);
valueStack.push(result.toString());
}


return valueStack.peek();
}

private int priority(Character op) //计算运算符优先级
{
Character add = new Character('+');
Character reduce = new Character('-');
Character minus = new Character('*');
Character dive = new Character('/');

if( (op.equals(add))||(op.equals(reduce)) )
{
return 1;
}
else if ( (op.equals(minus))||(op.equals(dive)) )
{
return 2;
}
else
{
return 0;
}
}

public Double calculate(String op, Double num1, Double num2)
{
if ("+".equals(op))
{
return num1 + num2;
}
if ("-".equals(op))
{
return num1 - num2;
}
if ("*".equals(op))
{
return num1 * num2;
}
if ("/".equals(op))
{
if (num2.equals(0.0))
{
System.out.println("Error");
}
else
{
return num1 / num2;
}
}
return null;
}

public static void main(String arg[])
{
String expression = "";
System.out.println("输入计算表达式:");
Scanner temp = new Scanner(System.in);
expression = temp.next();
System.out.println(expression);

Caculator b = new Caculator();
String res = b.compute(expression);
System.out.println("计算结果是:" + res);
}
}

...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
额 ...
bobo364 2010-05-31
  • 打赏
  • 举报
回复
貌似没啥问题,但我有个问题,借你的贴,问一下,计算器如何记忆上次的结果和后面的东西运算啊?我想搞个计算器,一次没问题,多次就碰到麻烦了
小一郎 2010-05-31
  • 打赏
  • 举报
回复
我用的jdk1.5

输入计算表达式:
(1+2)* 3 + (5/1)
(1+2)*
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Stack.java:79)
at java.util.Stack.pop(Stack.java:61)
at simplecomputer.Caculator.compute(Caculator.java:91)
at simplecomputer.Caculator.main(Caculator.java:161)
表达式输入错误
表达式输入错误
[1, 2]
[+, *]
[2.0]
[+]


[Quote=引用 7 楼 lodachi 的回复:]
jdk1.4环境下调通过 请问楼主哪调不过 报什么错 描述清楚好不 浪费大家时间 请原谅我说话就这么直

Java code


import java.util.Scanner;
import java.util.Stack;

public class Caculator {
public String compute(String expression) {
……
[/Quote]
lodachi 2010-05-31
  • 打赏
  • 举报
回复
jdk1.4环境下调通过 请问楼主哪调不过 报什么错 描述清楚好不 浪费大家时间 请原谅我说话就这么直


import java.util.Scanner;
import java.util.Stack;

public class Caculator {
public String compute(String expression) {
String exp = expression.trim();
char[] strs = exp.toCharArray();

Stack operatorStack = new Stack();
Stack valueStack = new Stack();

String topOperator = "";
String operandOne = "";
String operandTwo = "";

double result = 0.0;

for (int i = 0; i < strs.length; i++) {
String pointer = String.valueOf(strs[i]);
Character next = new Character(pointer.charAt(0));

switch (next.charValue()) {
case '+':
case '-':
case '*':
case '/':
if (operatorStack.isEmpty()) {
operatorStack.push(pointer);
} else {
topOperator = operatorStack.peek().toString();
Character a = new Character(topOperator.charAt(0));
while (priority(next) <= priority(a)) {
topOperator = operatorStack.pop().toString();
operandTwo = valueStack.pop().toString();
operandOne = valueStack.pop().toString();
Double num1 = Double.valueOf(operandOne);
Double num2 = Double.valueOf(operandTwo);
result = calculate(topOperator, num1, num2);
valueStack.push(String.valueOf(result));
}
operatorStack.push(pointer);
}
break;

case '(':
operatorStack.push(pointer);
break;

case ')':
topOperator = operatorStack.pop().toString();
while (topOperator != "(") {
operandTwo = valueStack.pop().toString();
operandOne = valueStack.pop().toString();
Double num1 = Double.valueOf(operandOne);
Double num2 = Double.valueOf(operandTwo);
result = calculate(topOperator, num1, num2);
valueStack.push(String.valueOf(result));

topOperator = operatorStack.pop().toString();
}
break;
default:
if (Character.isDigit(next.charValue())) {
valueStack.push(pointer);
} else {
System.out.println("表达式输入错误");
}
break;
}
}

while (!operatorStack.isEmpty()) {
System.out.println(valueStack);
System.out.println(operatorStack);

topOperator = operatorStack.pop().toString();
operandTwo = valueStack.pop().toString();
operandOne = valueStack.pop().toString();
Double num1 = Double.valueOf(operandOne);
Double num2 = Double.valueOf(operandTwo);
result = calculate(topOperator, num1, num2);
valueStack.push(String.valueOf(result));
}

return valueStack.peek().toString();
}

private int priority(Character op) // 计算运算符优先级
{
Character add = new Character('+');
Character reduce = new Character('-');
Character minus = new Character('*');
Character dive = new Character('/');

if ((op.equals(add)) || (op.equals(reduce))) {
return 1;
} else if ((op.equals(minus)) || (op.equals(dive))) {
return 2;
} else {
return 0;
}
}

public double calculate(String op, Double num1, Double num2) {
if ("+".equals(op)) {
return num1 .doubleValue()+ num2.doubleValue();
}
if ("-".equals(op)) {
return num1.doubleValue() - num2.doubleValue();
}
if ("*".equals(op)) {
return num1.doubleValue() * num2.doubleValue();
}
if ("/".equals(op)) {
if (num2.equals(new Double(0.0))) {
System.out.println("Error");
} else {
return num1.doubleValue() / num2.doubleValue();
}
}
return 0;
}

public static void main(String arg[]) {
String expression = "";
System.out.println("输入计算表达式:");
Scanner temp = new Scanner(System.in);
expression = temp.next();
System.out.println(expression);

Caculator b = new Caculator();
String res = b.compute(expression);
System.out.println("计算结果是:" + res);
}
}
lodachi 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vsking 的回复:]

Java虽然可以java虽然可以在不同手机上运行,但是效率很低,还不如不同平台针对性开发
java虽然可以跨平台,一般都是一次编译,到处异常,不断调试
java jdk升级太慢,不能提供给开发人员高效开发支撑,String.isNullOrEmpty;String.isNullOrWhiteSpace有么
java ide(myeclipse,netbean)提供的智能提示,调试等功能也不……
[/Quote]死一边去
signinchina 2010-05-31
  • 打赏
  • 举报
回复
myeclipse调一下就可以了
  • 打赏
  • 举报
回复
哦,没调试出来,期待大虾解决
vsking 2010-05-31
  • 打赏
  • 举报
回复
Java虽然可以java虽然可以在不同手机上运行,但是效率很低,还不如不同平台针对性开发
java虽然可以跨平台,一般都是一次编译,到处异常,不断调试
java jdk升级太慢,不能提供给开发人员高效开发支撑,String.isNullOrEmpty;String.isNullOrWhiteSpace有么
java ide(myeclipse,netbean)提供的智能提示,调试等功能也不足以提供给开发人员高效开发和调试
java jdk代码运行效率完全不能和.net相提并论,比如泛型,键值对搜索。。。。。。
q345911220 2010-05-31
  • 打赏
  • 举报
回复
+_+有点复杂。。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧