【问题标题】:Converting infix to prefix using a Stack (LinkedList)使用堆栈(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());


    }

}

【问题讨论】:

    标签: java collections stack prefix infix-notation


    【解决方案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--)
    

    【讨论】:

      猜你喜欢
      • 2013-11-08
      • 2015-04-19
      • 2015-09-12
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 2013-03-28
      • 2020-02-05
      相关资源
      最近更新 更多