Java 将中缀表达式转换为后缀表达式-空格插入无效

Java 将中缀表达式转换为后缀表达式-空格插入无效,java,parsing,spacing,Java,Parsing,Spacing,我正在制作一个转换器,它将中缀表达式转换成后缀表达式 Example: Infix: 2 * 3 - 10 / 4 Postfix: 2 3 * 10 4 / - 我有一个完整编码的方法,但它返回的后缀表达式是 2 3 * 1 0 4 / - 这有两个问题:1。主要的问题是,当它们应该在一起时,它们的值是1和0之间的一个空格(10)。2.有很多额外的空间,输出应该与上面提供的示例类似 我已经研究过从中缀到后缀的转换,但我无法确定如何进行比单个数字表达式转换更多的转换

我正在制作一个转换器,它将中缀表达式转换成后缀表达式

Example:
Infix: 2 * 3 - 10 / 4
Postfix: 2 3 * 10 4 / -
我有一个完整编码的方法,但它返回的后缀表达式是

2     3   *   1 0     4 / -
这有两个问题:1。主要的问题是,当它们应该在一起时,它们的值是1和0之间的一个空格(10)。2.有很多额外的空间,输出应该与上面提供的示例类似

我已经研究过从中缀到后缀的转换,但我无法确定如何进行比单个数字表达式转换更多的转换

下面是我的postfixtoinfix类的附件,表达式变量以完美的间距保存上面示例中所示的中缀

import java.util.*;

public class InfixToPostfix
{
//Declare Instance Variables
private String expression;
private Stack<Character> stack = new Stack<Character>();

//Constructor
public InfixToPostfix(String infixExpression)
{
        expression = infixExpression;
}//End of constructor

//Translate's the expression to postfix
public String translate()
{
    //Declare Method Variables
    String input = "";
    String output = "";
    char character = ' ';
    char nextCharacter = ' ';

    for(int x = 0; x < expression.length(); x++)
    {
        character = expression.charAt(x);

        if(isOperator(character))
        {
            while(!stack.empty() && precedence(stack.peek())>= precedence(character))
                output += stack.pop() + " ";
            stack.push(character);
        }   
        else if(character == '(')
        {
            stack.push(character);
        }
        else if(character == ')')
        {
            while(!stack.peek().equals('('))
                output += stack.pop() + " ";
            stack.pop();
        }
        else
        {
            if(Character.isDigit(character) && (x + 1) < expression.length() && Character.isDigit(expression.charAt(x+1)))
            {
                output += character;
            }
            else if(Character.isDigit(character))
            {
                output += character + " ";
            }   
            else
            {
                output += character;
            }
        }
    }//End of for

    while(!stack.empty())
    {
        output += stack.pop() + " ";
    }

    return output;
}//End of translate method

//Check priority on characters
public static int precedence(char operator)
{
    if(operator == '+' || operator =='-')
        return 1;
    else if(operator == '*' || operator == '/')
        return 2;
    else
        return 0;
}//End of priority method

public boolean isOperator(char element)
{
    if(element == '*' || element == '-' || element == '/' || element == '+')
        return true;
    else
        return false;
}//End of isOperator method

}//End of class
import java.util.*;
公共类InfixToPostfix
{
//声明实例变量
私有字符串表达式;
私有堆栈=新堆栈();
//建造师
公共InfixToPostfix(字符串infixExpression)
{
表达式=infixExpression;
}//构造函数结束
//把表达式翻译成后缀
公共字符串翻译()
{
//声明方法变量
字符串输入=”;
字符串输出=”;
字符='';
字符nextCharacter='';
for(int x=0;x=优先级(字符))
输出+=stack.pop()+“”;
stack.push(字符);
}   
else if(字符=='(')
{
stack.push(字符);
}
如果(字符=='),则为else
{
而(!stack.peek().equals('('))
输出+=stack.pop()+“”;
stack.pop();
}
其他的
{
if(Character.isDigit(Character)&(x+1)
您的代码没有将“10”视为单个实体,而是将其视为两个单独的字符“1”和“0”。对于任何不是运算符或参数的内容,您都可以执行
输出+=character+“”
这将为您提供
10
而不是所需的
10

将任意算术表达式从中缀(即算术表达式的常规形式)转换为后缀形式的问题并不像最初看起来的那么简单

算术表达式表示一种上下文无关的语言,可以使用下推自动化进行识别。这种识别的结果是可以构造语法树或AST(抽象语法树),可以自下而上遍历以构造后缀形式


一本没有太多理论的实用书是,我极力推荐。

就像@digitaljoel所说的,你将单个字符识别为词汇标记,而不是将完整的单词识别为标记

与读取单个字符然后决定它是什么标记(运算符或操作数)不同,您应该让解析器调用一个方法来从输入中读取下一个完整的标记。然后可以将标记作为字符串(包含组成标记的一个或多个字符)或类对象返回(包含令牌的文本和某种令牌类型属性)

否则,解析器仅限于处理单字符标记


使用单独的词法分析器读取标记的另一个好处是,您可以在词法分析器中而不是在解析器中处理空白。

请不要使用“请帮助紧急”在你的问题标题中。谢谢。有没有人在没有作业的情况下谈论过后缀?没有,因为如果它不是作业,我就不会在这里发布它,因为我会有更多的时间独立判断出什么问题。哈哈,你错误地认为一旦你离开学校就没有截止日期了.好的一面是,这是一个有趣的问题:-)是的,我知道问题是什么。我只是不知道解决办法。我想简单的答案应该是看看你在哪里添加空格。首先,我指出的语句是在general else中,这意味着如果
character
是一个空格,那么你就在输出中添加两个空格。general else也应用于any intel字符串中的er,因此需要添加空格来将其与运算符分开。我可以使用类似if(character.isDigit())的方法添加空格和character,或者只将字符添加到输出中吗?您可以使用它,试试看会发生什么。在else语句中,我尝试了if(character.isDigit(character)&&character.isDigit(expression.charAt(x+1)){output+=character;}else if(character.isDigit(character)){output+=character+“”;}else{output+=character;}但是我有StringIndexOutOfBoundsException,我该如何解决这个问题呢?我以后一定会读到。目前