java - 尝试为 RPN 计算器创建队列求解器时出现转换错误
问题描述
我正在尝试制作一个使用堆栈和队列将数字相加的 RPN 计算器。我让堆栈版本完美地工作。但是,当我运行队列时,它给了我这个错误:
Exception in thread "main" java.lang.ClassCastException: Hwk1.OperationNode cannot be cast to Hwk1.NumberNode
at Hwk1.RPNCalculator.main(RPNCalculator.java:133)
发生的事情是代码试图添加一个“+”符号。我不知道如何删除它或让代码忽略它。我尝试将其设置为 null 并尝试创建一个自动忽略它的 for 循环。
这是我的代码:
这是我的 RPN 类包 Hwk1;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class RPNCalculator {
public static void main(String[] args) {
// TODO Auto-generated method stub
Queue origQ = new Queue();
Queue calcQ = new Queue();
Stack origS = new Stack();
Stack calcS = new Stack();
File sFile = new File("stackTest.txt");
File qFile = new File("queueTest.txt");
//Stack
try {
Scanner sc = new Scanner(sFile);
while(sc.hasNextLine()) {
String value = sc.nextLine();
if (value.matches("[0-9]*\\.[0-9]+|[0-9]+")) {
origS.push(new NumberNode(Double.parseDouble(value)));
}
else {
origS.push(new OperationNode(value));
}
}
while(!origS.isEmpty()) {
LinkedNode next = origS.pop();
if(next instanceof NumberNode) {
calcS.push(next);
}
else if (next instanceof OperationNode) {
String op = ((OperationNode) next).operator;
if (op.equals("+")) {
double num1 = ((NumberNode) calcS.pop()).value;
double num2 = ((NumberNode) calcS.pop()).value;
double res = num1 + num2;
calcS.push(new NumberNode(res));
}
else if (op.equals("-")) {
double num1 = ((NumberNode) calcS.pop()).value;
double num2 = ((NumberNode) calcS.pop()).value;
double res = num1 - num2;
calcS.push(new NumberNode(res));
}
else if (op.equals("*")) {
double num1 = ((NumberNode) calcS.pop()).value;
double num2 = ((NumberNode) calcS.pop()).value;
double res = num1 * num2;
calcS.push(new NumberNode(res));
}
else if (op.equals("/")) {
double num1 = ((NumberNode) calcS.pop()).value;
double num2 = ((NumberNode) calcS.pop()).value;
double res = num1 / num2;
calcS.push(new NumberNode(res));
}
else if (op.equals("%")) {
double num1 = ((NumberNode) calcS.pop()).value;
double num2 = ((NumberNode) calcS.pop()).value;
double res = num1 % num2;
calcS.push(new NumberNode(res));
}
else if (op.equals("^")) {
double num1 = ((NumberNode) calcS.pop()).value;
double num2 = ((NumberNode) calcS.pop()).value;
double res = Math.pow(num1, num2);
calcS.push(new NumberNode(res));
}
else {
System.out.println("Invalid operator.");
}
} else {
System.out.println("Invalid value");
}
}
double answer = ((NumberNode) calcS.pop()).value;
System.out.println(answer);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Queue
try {
Scanner sc = new Scanner(qFile);
while(sc.hasNextLine()) {
String value = sc.nextLine();
if (value.matches("[0-9]*\\.[0-9]+|[0-9]+")) {
origQ.enqueue(new NumberNode(Double.parseDouble(value)));
}
else {
origQ.enqueue(new OperationNode(value));
}
}
while(!origQ.isEmpty()) {
LinkedNode next = origQ.dequeue();
if(next instanceof NumberNode) {
calcQ.enqueue(next);
}
else if (next instanceof OperationNode) {
String op = ((OperationNode) next).operator;
double num1;
double num2;
double res;
if (op.equals("+")) {
num1 = ((NumberNode) calcQ.dequeue()).value;
num2 = ((NumberNode) calcQ.dequeue()).value;
System.out.println(calcQ.dequeue());
res = num1+num2;
NumberNode newNode = new NumberNode(res);
calcQ.enqueue(newNode);
}
else if (op.equals("*")) {
num1 = ((NumberNode) calcQ.dequeue()).value;
num2 = ((NumberNode) calcQ.dequeue()).value;
res = num1*num2;
calcQ.enqueue(new NumberNode(res));
}
else if (op.equals("/")) {
num1 = ((NumberNode) calcQ.dequeue()).value;
num2 = ((NumberNode) calcQ.dequeue()).value;
res = num1/num2;
calcQ.enqueue(new NumberNode(res));
}
else if (op.equals("%")) {
num1 = ((NumberNode) calcQ.dequeue()).value;
num2 = ((NumberNode) calcQ.dequeue()).value;
res = num1%num2;
calcQ.enqueue(new NumberNode(res));
}
else if (op.equals("-")) {
num1 = ((NumberNode) calcQ.dequeue()).value;
num2 = ((NumberNode) calcQ.dequeue()).value;
res = num1-num2;
calcQ.enqueue(new NumberNode(res));
}
else if (op.equals("^")) {
num1 = ((NumberNode) calcQ.dequeue()).value;
num2 = ((NumberNode) calcQ.dequeue()).value;
res = Math.pow(num1, num2);
calcQ.enqueue(new NumberNode(res));
}
else {
System.out.println("Invalid Operator");
}
}
else {
System.out.println("Invalid value");
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是我的队列类
package Hwk1;
public class Queue {
LinkedNode firstNode;
LinkedNode lastNode;
int size;
public Queue() {
}
public boolean isEmpty() {
return (this.firstNode == null);
}
public int size() {
return this.size;
}
public LinkedNode dequeue() {
if (isEmpty()) {
System.out.println("Queue is empty.");
return null;
}
else {
LinkedNode temp = this.firstNode;
this.firstNode = this.firstNode.nextNode;
this.size--;
return temp;
}
}
public void enqueue(LinkedNode node) {
if (isEmpty()) {
this.firstNode = node;
this.lastNode = this.firstNode;
this.size++;
}
else if (this.size == 1) {
this.lastNode = node;
this.firstNode.nextNode = this.lastNode;
this.size++;
}
else {
LinkedNode temp = this.lastNode;
this.lastNode = node;
temp.nextNode = this.lastNode;
this.size++;
}
}
}
这是我的 Stack 类(以防万一有人想要它)
package Hwk1;
public class Stack {
int size;
LinkedNode topNode;
public Stack() {
}
public boolean isEmpty() {
return (this.topNode == null);
}
public LinkedNode pop() {
if (isEmpty()) {
System.out.println("Stack is empty");
return null;
}
else {
LinkedNode temp = this.topNode;
this.topNode = temp.nextNode;
this.size--;
return temp;
}
}
public void push(LinkedNode node) {
if (isEmpty()) {
this.topNode = node;
this.size++;
}
else {
LinkedNode temp = this.topNode;
this.topNode = node;
this.topNode.nextNode = temp;
this.size++;
}
}
public int size() {
return this.size;
}
}
NumberNode 代码:
package Hwk1;
public class NumberNode extends LinkedNode{
double value;
public NumberNode(double value) {
super();
this.value = value;
}
}
操作节点代码:
package Hwk1;
public class OperationNode extends LinkedNode {
String operator;
public OperationNode(String operator) {
super();
this.operator = operator;
}
}
解决方案
推荐阅读
- javascript - SVG 颜色更新脚本不适用于桌面,但适用于移动设备
- javascript - Winston logging - Winston 3.x 中漂亮的 JSON 格式
- javascript - 对所有屏幕使用相同的组件 REACT-NATIVE
- mariadb - MariaDB JSON 删除键及其值
- python - 如何激活 UITextEntryLine pygame_gui 元素?
- c# - 准确返回在数组中找到的字符串
- ios - 传递给 Xcode 中不带参数的调用的参数
- excel - 如何使用 Excel Solver 进行分段线性拟合?
- javascript - scrollIntoView 不起作用,为什么?以及如何修复?
- c# - 这个 Hashset 锁是线程安全的吗?