使用堆栈(LinkedList)将中缀转换为前缀

Posted

技术标签:

【中文标题】使用堆栈(LinkedList)将中缀转换为前缀【英文标题】:Converting infix to prefix using a Stack (LinkedList) 【发布时间】:2014-11-03 13:47:30 【问题描述】:

我正在尝试编写一个将中缀转换为前缀的方法,为此我想读取一个反向字符串并使用堆栈。当我执行此代码时,我在 character = expression.charAt(limit); 遇到异常我该如何修复该代码?

我的输入是 1+3 我得到的错误是:

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常: 字符串索引超出范围:java.lang.String.charAt(Unknown) 处的 3 源)在 PrefixTranslator.translate(PrefixTranslator.java:27) 在 PrefixTranslatorTest.main(PrefixTranslatorTest.java:11)

PrefixTranslator 类:

public class PrefixTranslator


static private String expression;
private MyStack<Character> stack = new MyStack<Character>();

//Constructor
public PrefixTranslator(String infixExpression)

        expression = infixExpression;
//End of constructor



public String translate()

    //Declare Method Variables
    String input = "";
    String output = "";
    char character = ' ';
    char nextCharacter = ' ';


    for(int limit = expression.length(); limit > 0 ; limit--)
    
        character = expression.charAt(limit);

        if(isOperator(character))
        
            output = output + character + " ";
           
        else if(character == '(')
        
            stack.push(character);
        
        else if(character == ')')
        
            while(!stack.top().equals('('))
                output = output + stack.pop() + " ";
            stack.pop();
        
        else
        
            if(Character.isDigit(character) && (limit + 1) < limit && Character.isDigit(expression.charAt(limit+1)))
            
                stack.push(character);
                stack.push(expression.charAt(limit+1));
            
            else if(Character.isDigit(character))
            
                stack.push(character);
               
            else
            
                output = output + character;
            
        
    //End of for

    while(!stack.isEmpty())
    
        output = 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

PrefixTranslatorTest 类:

import java.util.Scanner;

public class PrefixTranslatorTest

    public static void main(String[] args)
    
        Scanner input = new Scanner(System.in);
        System.out.println("Enter the expression that you want to convert to prefix.");
        String expression = input.next();
        PrefixTranslator translator = new PrefixTranslator(expression);
        System.out.println(translator.translate());


    


【问题讨论】:

【参考方案1】:

对于给定的输入1+3expression.length() 返回3,您可以参考该字符串的索引0-2。所以,你的循环不应该是:

for(int limit = expression.length(); limit > 0 ; limit--)

应该是

for(int limit = expression.length() - 1; limit >= 0 ; limit--)

【讨论】:

现在,当我尝试使用 (1+3) 之类的括号转换表达式时出现另一个错误,它给出了另一个错误,例如 Exception in thread "main" EmptyStackException: Stack is empty. at PrefixTranslator.translate(PrefixTranslator.java:41) at PrefixTranslatorTest.main(PrefixTranslatorTest.java:11) 您从最后一个字符) 开始,它进入else if(character == ')') 并在其中逐步执行while 循环,然后尝试从堆栈中弹出一个字符。你在第一个字符和堆栈是空的。所以抛出异常。 哦,是的,你是对的,谢谢你的帮助。你帮了我很多:) 不客气。你可以参考这个链接的算法,应该很容易将算法转换成Java代码:see-programming.blogspot.com.tr/2013/02/…【参考方案2】:

Java 数组的第一个索引是0length() 方法返回数组的元素个数。如果您需要最后一个元素的索引,请使用 length() - 1

所以不是

for (int limit = expression.length(); limit > 0; limit--)

使用

for (int limit = expression.length() - 1; limit >= 0; limit--)

【讨论】:

以上是关于使用堆栈(LinkedList)将中缀转换为前缀的主要内容,如果未能解决你的问题,请参考以下文章

数组模拟实现一个50个字符串的堆栈,使用堆栈,将中缀算术表达式转换成后缀表达式。

数组模拟实现一个50个字符串的堆栈,使用堆栈,将中缀算术表达式转换成后缀表达式。

数组模拟实现一个50个字符串的堆栈,使用堆栈,将中缀算术表达式转换成后缀表达式。

使用链表堆栈的中缀到后缀转换器

如何使用 lua 构建中缀 TO 前缀函数

可以仅使用队列将中缀表示法的字符串转换为前缀表示法吗? (考虑唯一的操作是 + 和 - 的情况)