我正在实现分流场算法并评估结果,这是一个基于引用的实现,使用节点(一个用于运算符,一个用于操作数)和堆栈(一个用于运算符,一个用于操作数)。
5
5-3
5*(3+4)
7*3+5*6
2+5*(7+8)/3
53 = 53
53513 = 1
535152
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 7
at java.lang.String.charAt(String.java:646)
at LabIII.main(LabIII.java:48)
Process completed.
public class LabIII
{
public static String expr;
public static String line;
public static void main(String[] args) throws IOException
{
try
{
BufferedReader input = new BufferedReader(new FileReader("input.txt")); // Create input reader
char token;
int tokenI;
char popOp;
int popInt1;
int popInt2;
int result;
while ((line = input.readLine()) != null) // While the input file still has a line with characters
{
operatorStack opStack = new operatorStack(); // Initalize the operator stack
opStack.push(';');
operandStack intStack = new operandStack();
expr = line;
int count = 1;
while(count <= expr.length())
{
int index = count - 1;
if(Character.isDigit(expr.charAt(index))) // If token is an operand
{
tokenI = expr.charAt(index);
System.out.print(tokenI);
intStack.push(tokenI);
count++;
}
else
{
token = expr.charAt(count);
if(token == ')')
{
while(opStack.peek() != '(')
{
popOp = opStack.pop();
System.out.print(popOp);
popInt1 = intStack.pop();
popInt2 = intStack.pop();
result = evaluate(popInt1, popInt2, popOp);
intStack.push(result);
}
opStack.pop(); // Pop the "(" and discard it
count++;
}
else
{
while(inputPriority(token) <= stackPriority(opStack.peek()))
{
popOp = opStack.pop();
System.out.print(popOp);
popInt1 = intStack.pop();
popInt2 = intStack.pop();
result = evaluate(popInt1, popInt2, popOp);
intStack.push(result);
}
opStack.push(token);
count++;
}
}
}
while (opStack.peek() != ';')
{
popOp = opStack.pop();
System.out.print(popOp);
popInt1 = intStack.pop();
popInt2 = intStack.pop();
result = evaluate(popInt1, popInt2, popOp);
intStack.push(result);
}
System.out.print(" = " + intStack.pop());
System.out.println();
count = 0;
}
}
catch (IOException ex)
{
System.err.println("Exception:" + ex);
}
}
}
public class operandStack
{
int integ;
NodeInt top;
NodeInt temp;
public operandStack() // Default constructor: empty stack
{
top = null;
}
public boolean isEmpty() // Returns true if the top of the stack is null
{
return top == null;
}
public void push(int integ) // Push an item onto the top of the stack
{
top = new NodeInt(integ, top);
}
public int pop()
{
NodeInt temp = top;
top = top.getNext();
return temp.getItem();
}
public void popAll()
{
top = null;
}
public int peek()
{
return top.getItem();
}
}
节点(也是用于操作数/整数的节点):
public class Node{
private char item;
private Node next;
public Node(char newItem)
{
item = newItem;
next = null;
}
public Node(char newItem, Node nextNode)
{
item = newItem;
next = nextNode;
}
public char getItem()
{
return item;
}
public void setNext(Node nextNode)
{
next = nextNode;
}
public Node getNext()
{
return next;
}
}
算法如下:
将运算符堆栈初始化为包含“;”(堆栈底部运算符)
否则,如果令牌是')',则
而运算符堆栈的顶部不等于“(”
弹出运算符堆栈
否则
而inputPriority(令牌)≤stackPriority(运算符堆栈的顶部)
弹出运算符堆栈
获取下一个令牌
结束时
而运算符堆栈的顶部不等于“;”
弹出操作数堆栈并打印结果
任何帮助都很感激。
token = expr.charAt(count);
这应该是
token = expr.charAt(index);
我不知道您为什么要费心维护索引
和计数。
只会导致这样的麻烦。
问题内容: 快速提问。我在程序中有以下代码: 输入是用户输入 是值为0的整数,如所见 运行代码会产生以下错误: 线程“主”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: java.lang.String.charAt为6 ( program.main(program.java:15)) 如果我将 改为0而不是,则不会产生错误… 该怎
问题内容: 因此,我正在编写一个简单的程序来输入字符串并计算总数。的米 所以,这是我的代码 where 和str是我接受过的字符串,但是此错误不断出现 这是什么错误以及如何将其删除? 问题答案: 字符串,有效索引从0到n-1; 更改 至
问题内容: 我目前正在从一本名为《 Python绝对入门》(第三版)的书中学习python。书中有一个练习,概述了一个子手游戏的代码。我遵循了这段代码,但是我在程序的中间不断返回错误。 这是导致问题的代码: 这也是它返回的错误: 有人可以帮助我解决出现的问题以及如何解决该问题吗? 编辑:我像这样初始化so_far变量: 问题答案: 您好像缩进得太多了。尝试这个:
问题内容: 我猜我正在收到此错误,因为字符串正在尝试对值进行子字符串化。但是那部分不能消除这个问题吗? 这是Java代码段: 我收到此错误: 问题答案: 我猜我正在收到此错误,因为字符串试图将Null值作为子字符串。但是“ .length()> 0”部分不能消除该问题吗? 不,在itemdescription为null时调用itemdescription.length()不会生成StringInd
试图用Gradle编译一个Android项目,却出现了一个奇怪的错误。当我运行。尝试了清洁重建,新鲜克隆的repo,不同的分支,同事都能建立AOK。 寻找事物的想法来检查/试图解决这个问题。 *更新:恢复到Gradle 2.11和似乎已经解决了这个问题。* Groovy:2.4.4 Ant:Apache Ant(TM)版本1.9.6编译于2015年6月29日JVM:1.8.0_101(Oracle
例:“at”和“tack”应该返回true,“tree”和“ere”应该返回false。 在查看注释后编辑,我的新代码现在是这样的。它总是返回false,即使带有“tree”和“tree”。