Java 推送和评估堆栈<;双倍>;

Java 推送和评估堆栈<;双倍>;,java,stack,double,evaluation,postfix-notation,Java,Stack,Double,Evaluation,Postfix Notation,第一次发布,请告知我如何改进 我正在开发一个程序,将中缀符号转换为后缀,然后进行求值。我向后缀的转换进行得很顺利,但我的评估遇到了一些问题。在下面的代码中,当我尝试将操作数转换为双变量“number”时,它们不会保持其值(请参见下面的运行时输出)。这里是有问题的方法的一部分(print语句仅用于调试) public boolean evaluatePostfix(StringBuffer后缀) { 堆栈操作数=新堆栈();//用于保存操作数值的堆栈 double answer=0;//用于保存表

第一次发布,请告知我如何改进

我正在开发一个程序,将中缀符号转换为后缀,然后进行求值。我向后缀的转换进行得很顺利,但我的评估遇到了一些问题。在下面的代码中,当我尝试将操作数转换为双变量“number”时,它们不会保持其值(请参见下面的运行时输出)。这里是有问题的方法的一部分(print语句仅用于调试)

public boolean evaluatePostfix(StringBuffer后缀)
{
堆栈操作数=新堆栈();//用于保存操作数值的堆栈
double answer=0;//用于保存表达式结果的变量
布尔错误=false;//测试输入错误
int pos=0;//临时变量在后缀表达式中存储位置
double number=0;//将字符转换为双精度的临时变量。还存储该值以供参考
double val1=0;//操作的第一个值
double val2=0;//操作的第二个值
double val3=0;//回答val1和val2
而(!error&&pos
---在运行时--1

数字=49.000000

八,

数字=56.000000

+

val1:56.000000

val2:49.000000

val3=105.000000

105.0


您正在获取每个字符的ASCII值,例如“1”=>
49
,并将其推送到堆栈中

最可能的情况是,您需要使用a来读取从您输入的文本转换而来的数字。

替换:

number = postfix.charAt(pos);
与:

方法将字符串转换为双精度:

返回一个初始化为 指定的字符串,由类Double的valueOf方法执行

(来自Javadoc)


如果使用postfix.toString.split(“”)拆分字符串,然后在字符串[]上进行迭代,则还可以解析双值(如“8.4567”):


否则,您的代码仅解析一位数整数值是正确的。

解析表达式可能不是一项简单的任务。在更复杂的情况下,使用解析器生成器是唯一合理的方法

在您的情况下,您可以不使用:

  • 你的“代币”是什么
  • 如何检测每个令牌的开始和结束
  • 一旦您从输入中提取了令牌,您将如何处理它们
您的标记似乎是(十进制)数字和算术运算符。-如何确定每个标记的开始和结束?它们之间的空格“”可能是一个足够的分隔符

然后您可以一次清晰地解析一个标记:使用
Double.parseDouble(…)
解析数字标记并相应地处理运算符


您可能想看看Java对从输入中提取令牌的支持。

请选择代码并单击花括号
{}
,格式化代码。您可以使用
{}
按钮,将整个文本块格式化为代码,它将通过缩进和颜色编码很好地显示。感谢tipI的格式化,我确实认为这是ASCII值。不过我不理解有关扫描仪的说明。该方法从另一个方法中提取“后缀”字符串并读取这些值。是吗在我将这些数字“推”到堆栈上之前,有一个函数或什么东西可以将它们转换为双精度?我的意思是用来读取双精度。@HannoBinder感谢您添加链接。我已将其更改为使用Java 7。您可以尝试使用
Character.toString(postfix.charAt(pos))
要从字符中获取字符串。为了纠正我的错误,我将使用StringBuffer的substring方法编辑我的答案,该方法直接返回字符串。@TonyRad:对不起,也不能这样做:'子字符串从指定的索引开始并延伸到此序列的结尾。':)+1,右:number=Double.parseDouble(Character.toString(postfix.charAt(pos));(或者你可以用廉价的方式,
“”+postfix.charAt(pos)
——但你不是从我这里得到的,好吗?;-)
number = postfix.charAt(pos);
number = Double.parseDouble(Character.toString(postfix.charAt(pos)));
    String[] sa = postfix.toString().split(" ");        
    for (String string : sa) {
    .... omissis ...