gpt4 book ai didi

java - 打印出由 JAVA 堆栈操作的表达式

转载 作者:行者123 更新时间:2023-12-01 13:19:10 26 4
gpt4 key购买 nike

嘿伙计们,这是我的问题。我有一个类可以操作一堆分数,它是一个 RPN 求值​​器。我对 Java 比较陌生,只知道基本的数据结构。这是一个类(class)项目,但我有点沮丧。我需要打印出我使用的表达式,或者打印出表达式,直到 RPN 表达式无效(由 valid = false/true 表示) 我有一种特定的方法,我必须将其打印出来,但举个例子,但我不知道该怎么做...我有一个队列可供我使用,但我必须同时使用堆栈和队列。我意识到代码很糟糕,但这是因为我还没有开始清理该类。如果输入如下,这是我需要的输出示例......请注意,输入在引号中减去引号

输入************************************输出

  1. “(2/5)(1/2) * * #”******** ***表达式 3 为:(2/5)(1/2)**
  2. “(3/1)T ^ (3/2) #”******** ***表达式 4 为:(3/1)T

这是我的类(class)(我知道它很草率......而且规则对我可以使用和不能使用的内容非常严格。没有链接列表等......)

import java.util.Scanner;

public class RpnEvaluator
{
private final int MAX_TOKEN = 20;
private Scanner stdin;
private int count = 0;

public void run() throws java.io.IOException
{

runOnce();
}

public boolean isOperator(String input)
{
String[] oprtr = {"+", "-", "*"};
for(String choice: oprtr)
if(choice.equals(input))
return true;
return false;
}

public boolean isOperation(String input)
{
if(input.startsWith("(", 0))
return true;
return false;
}

public Fraction runOperation(String choice, Fraction op2, Fraction op1)
{
Fraction newFract = new Fraction();
if(choice.equals("*"))
newFract = new Fraction(op1.times(op2));
else if(choice.equals("+"))
newFract = new Fraction(op1.plus(op2));
else if(choice.equals("-"))
newFract = new Fraction(op1.minus(op2));

return newFract;
}

public void runOnce()
{
String readIn = "";
boolean valid = true;
Fraction op1 = null, op2 = null, answer = null, myFract;
Queue myQueue = new Queue(MAX_TOKEN);
Stack myStack= new Stack(MAX_TOKEN);
stdin = new Scanner(System.in);
while(stdin.hasNext() && valid == true)
{
readIn = stdin.next();
if(readIn.equals("#"))
{
break;
}
else if(!isOperator(readIn) && isOperation(readIn))
{
myFract = new Fraction(readIn);
myStack.push(myFract);
}
else if(isOperator(readIn))
{
if(myStack.isEmpty())
valid = false;
else
op2 = (Fraction)myStack.pop();
if(myStack.isEmpty())
valid = false;
else
op1 = (Fraction)myStack.pop();
myStack.push(runOperation(readIn, op2, op1));
}
else
valid = false;
}
if(myStack.isEmpty())
valid = false;
else
answer = (Fraction)myStack.pop();
if(!myStack.isEmpty())
valid = false;

if(valid == false)
{
System.out.print("Expression " + ++count + ": ");
System.out.println("Invalid Expression");
}
else
{
System.out.println("Expression " + ++count + ": ");
System.out.println("The value is: " + answer.toString());
}

clear(myStack, myQueue);
}

public void clear(Stack myStack, Queue myQueue)
{
myStack.clear();
myQueue.clear();
}

}

最佳答案

I've got a class that manipulates a stack of Fractions and it is an RPN Evaluator.

不,不是。这是一种尝试,但它根本不处理括号或运算符优先级。您需要查找 Dijsktra 调车场算法。如果这是一项作业,我毫不怀疑这个算法在类里面被提到过,而且可能很长。

I realize the code is yuck but its because I haven't begun my cleanup of that class yet.

清理类的最佳方法首先就是不要让它充满污垢。编写随后必须删除的代码是双重浪费时间。

关于java - 打印出由 JAVA 堆栈操作的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22186863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com