- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现 Shunting-Yard 算法并评估结果。这是一种基于引用的实现,使用节点(一个用于运算符,一个用于操作数)和堆栈(一个用于运算符,一个用于操作数)。
<小时/>输入文件包含(仅前几行):
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);
}
}
}
operandStack(也是operatorStack的一个。相同,只是使用char而不是int):
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;
}
}
算法如下:
初始化运算符堆栈以包含“;”(堆栈底部运算符)
获取第一个 token
当未到达表达式末尾时
如果标记是操作数,则
打印 token
将操作数压入操作数栈
否则,如果 token 是“)”,则
而操作符栈顶不等于‘(’
弹出操作符堆栈
打印运算符
将操作数堆栈弹出两次
对两个操作数应用指定的运算
将运算结果压入操作数栈
结束时
弹出“(”并将其丢弃
其他
当 inputPriority(token) ≤ stackPriority(操作符堆栈顶部)
弹出操作符堆栈
打印运算符
将操作数堆栈弹出两次
对两个操作数应用指定的运算
将运算结果压入操作数栈
结束时
将 token 压入操作符堆栈
获取下一个 token
结束时
而操作符栈顶不等于‘;’
弹出操作符堆栈
打印运算符
将操作数堆栈弹出两次
对两个操作数应用指定的运算
将运算结果压入操作数栈
结束时
弹出操作数栈并打印结果
感谢任何帮助。
最佳答案
token = expr.charAt(count);
这应该是
token = expr.charAt(index);
我不知道你为什么要费心去维护index
和count。
它只会导致这样的麻烦。
关于java - Java 中的 Shunting-Yard 算法实现给出了错误的输出和字符串索引超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29379710/
我正在运行“yard server -g”,但它只为 axlsx 生成目录。 当我点击一个类(class)时,我得到: undefined method `new' for nil:NilClass.
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.remove()方法的一些代码示例,展示了Yard.remove()的具体用法
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.getName()方法的一些代码示例,展示了Yard.getName()的具体
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.update()方法的一些代码示例,展示了Yard.update()的具体用法
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.getQueryFactory()方法的一些代码示例,展示了Yard.getQ
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.find()方法的一些代码示例,展示了Yard.find()的具体用法。这些代
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.findRepresentation()方法的一些代码示例,展示了Yard.f
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.create()方法的一些代码示例,展示了Yard.create()的具体用法
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.getId()方法的一些代码示例,展示了Yard.getId()的具体用法。这
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.findReferences()方法的一些代码示例,展示了Yard.findR
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.isRepresentation()方法的一些代码示例,展示了Yard.isR
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.removeAll()方法的一些代码示例,展示了Yard.removeAll(
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.getRepresentation()方法的一些代码示例,展示了Yard.ge
本文整理了Java中org.apache.stanbol.entityhub.servicesapi.yard.Yard.getValueFactory()方法的一些代码示例,展示了Yard.getV
我正在开发一个 Ruby 编程教程,我想用 Yard 记录它。 .默认情况下,Yard 将模块/类中的所有方法按字母顺序排列。但是,由于教程中每个模块中的方法都是相互构建的,因此我希望按照我编写它们的
我想使用 Yard 从我的自述文件链接到另一个额外的文件。 例如,我有以下几行: ...关于如何贡献的详细说明 [此处](contributing.md) 我希望这个链接到我的文件 contribut
我使用 YARD 为 ruby 项目生成文档。该项目包含一个 README.md 文件,如下所示: # MyTool Welcome to your new gem! ... ##
是否有约定表明 YARD 样式文档中的参数仅用于其“真实性”状态,即您只想知道它是 false 还是 nil 还是真实的? 下面通常用什么代替 Truthy? # @param [String] na
我有一个看起来像这样的方法: def get_endpoint(params: {}) end 我希望这个方法的调用者能够传入一些可选参数。 我想编写 YARD 文档来支持这一点,如果我不使用关键字参
我想在 yard-genereted 文档中包含图像,但无法在任何地方找到如何执行此操作...有人知道如何执行此操作吗? 最佳答案 您可以只添加 标记到您的文档: # Blah-blah # #
我是一名优秀的程序员,十分优秀!