簡體   English   中英

將Infix表達式轉換為Postfix表達式 - 無效的空間插入

[英]Converting a Infix expression into a Postfix expression - invalid space insertion

我正在制作一個轉換器,它將采用中綴表達式並將它們轉換為后綴表達式。

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

您的代碼不會將“10”視為單個實體,而是視為兩個單獨的字符“1”和“0”。 對於任何不是運算符或parens的東西,你output += character + " "; 這將給你1 0而不是所需的10

將任意算術表達式從其中綴(即傳統的算術表達式)轉換為后綴形式的問題並不像最初看起來那么簡單。

算術表達式表示無上下文語言,可以使用下推自動化識別。 作為這種識別的結果,可以構造語法樹或AST(抽象語法樹),其將自下而上地行走以構造后綴形式。

沒有太多理論的一本很好的實用書就是語言實現模式 ,我強烈推薦。

就像@digitaljoel所說,你將單個字符識別為詞匯標記,而不是完整的單詞作為標記。

您應該讓解析器調用一個方法從輸入中讀取下一個完整的標記,而不是讀取單個字符,然后決定它是什么標記(操作符或操作數)。 然后,令牌可以作為字符串(包含一個或多個包含令牌的字符)返回,或者作為類對象(包含令牌的文本和某種token_type屬性)返回。

否則,您的解析器僅限於處理單字符令牌。

使用單獨的詞法分析器讀取令牌的另一個好處是,您可以在詞法分析器中而不是在解析器中處理空格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM