使用堆栈(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+3
expression.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 数组的第一个索引是0
,length()
方法返回数组的元素个数。如果您需要最后一个元素的索引,请使用
length() - 1
。
所以不是
for (int limit = expression.length(); limit > 0; limit--)
使用
for (int limit = expression.length() - 1; limit >= 0; limit--)
【讨论】:
以上是关于使用堆栈(LinkedList)将中缀转换为前缀的主要内容,如果未能解决你的问题,请参考以下文章
数组模拟实现一个50个字符串的堆栈,使用堆栈,将中缀算术表达式转换成后缀表达式。
数组模拟实现一个50个字符串的堆栈,使用堆栈,将中缀算术表达式转换成后缀表达式。