2014-03-05 28 views
0

嘿傢伙們所以繼承人我的問題。我有一個操作一堆Fractions的類,它是一個RPN評估器。我更新Java,只知道基本的數據結構。這是一個班級的項目,但我很沮喪。我需要打印出我用過的表達式,或者打印出表達式,直到RPN表達式無效,用valid = false/true表示我有一個具體的方法,我必須將它打印出來並給出一個例子,但我無法弄清楚該怎麼做它...我有一個隊列可供我使用,但我必須同時使用堆棧和隊列。我意識到代碼是yuck但它是因爲我還沒有開始清理那個類。下面是輸出我需要的,如果輸入是如下的例子....注意:輸入是在報價減去引號打印一個由Stack JAVA處理的表達式

輸入* * ** * ** * * * * ** * ** * ** * ** * ** * ** * ** * *** *輸出

  1. 「(2/5)(1/2)* *#」 * ** * ** * ** * *式3爲:( 2/5)(1/2)**
  2. 「(3/1)T 1(3/2)#」 * ** * ** * ** * * Expressi在4是:(3/1)T

這是我的課(我知道它是馬虎......而規則是非常限制我可以和不能使用。無鏈表等...)

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(); 
    } 

    } 

回答

1

我有操縱分數堆疊的類,它是一個RPN計算器。

不,它不是。這是一種嘗試,但它根本不處理括號,或運算符優先級。您需要查看Dijsktra調車碼算法。如果這是一項任務,我毫不懷疑這個算法在課堂上被提及,可能是很長的。

我意識到代碼是yuck,但是因爲我還沒有開始清理那個類。

清理班級的最好方法不是首先填滿髒東西。編寫必須隨後刪除的代碼是時間的雙重浪費。

+0

isOperation檢查左括號。並且這個算法沒有被提及一次... – user3381498

0

好吧,這是很不清楚你在問什麼,你的代碼沒有太多的意義和分數可變部分是未知的。

只是一個註釋,這裏總是清理你的代碼,因爲以後你永遠不會知道它在哪裏,總是會令人困惑。

嘗試http://www.planet-source-code.com/vb/scripts/search.asp?lngWId=2

對於一些例子,他們總是有我需要的東西。

如果你是新來的java,並想知道更多,我會建議書Java編程:從問題分析到程序設計,它解釋了從主要方法到GUI設計的一切。

以後再請詳細解釋你的問題,我們不知道你在問什麼。

謝謝。

+0

我給了你一個例子。我想知道如何顯示RPN表達式的輸入。例如:如果我運行我的程序,我會輸入 (1/3)(1/5) - (40/1)*並預期(1/3)(1/5) - (40/1)* 你想讓我只發佈每一堂課嗎?我受到壓力,一直在爲這件事工作了4個小時。我無法弄清楚如何獲得RPN表達式;字面表達,打印出來。 – user3381498

+0

如果您嘗試顯示輸入,請嘗試將輸入添加到字符串,然後顯示帶有輸出的字符串 例如 字符串輸入; JTextField inputTF; JTextField outputTF; input = inputTF.getText();所有計算方法 outputTF.setText(output); –

+0

任何我可以做到這一點沒有GUI?這是基於控制檯.. – user3381498