2013-09-28 45 views
2

我已經編寫了一個將中綴表達式轉換爲後綴表達式的程序。不過,我需要多輸入和停止時,我發現一個0一次在java中的多個輸入

我所是,

輸入:(3 + 4)*(3-1)

輸出:4 + 3 1 - *

我需要的是,

輸入:

(3 + 4)*(3-1)

(3 * 4) - (3 * 1)

(3 + 4)*(3-1)

(3 + 2)*((3-3)

(3+ 4)*(3-1)

輸出:

4 + 3 1 - *

4 * 3 1 * -

4 + 3 1 - *

語法錯誤

4 + 3 1 - *

的代碼是:

public static void main(String args[])throws IOException 
{ 
    BufferedReader input = new BufferedReader (new InputStreamReader(System.in)); 
    String s = input.readLine(); 
    String pf = new String(); 
    int i=0, check=0; 
    Stack<Character> s1 = new Stack<>(); 


    while(i<s.length()) 
    { 
     if(isOperand(s.charAt(i))) 
     { 
      pf += s.charAt(i); 
     } 
     else if(isOperator(s.charAt(i))) 
     { 
      while (!s1.empty() && s1.peek() != '(' && compareOperators(s1.peek(),s.charAt(i)) <= 0) 
      { 
       pf += ' '; 
       pf += s1.peek(); 
       s1.pop(); 
      } 
      pf += ' '; 
      s1.push(s.charAt(i)); 
     } 
     else if (s.charAt(i) == '(') 
     { 
      s1.push(s.charAt(i)); 
     } 
     else if (s.charAt(i) == ')') 
     { 
      check++; 
      while (!s1.empty()) 
      { 
       if ((char)s1.peek() == '(') 
       { 
        check--; 
        s1.pop(); 
        break; 
       } 
       pf += ' '; 
       pf += s1.peek(); 
       s1.pop(); 
      } 
     } 
     i++; 
    } 


    while (!s1.empty()) { 
     if(s1.peek()=='(') 
      check--; 
     pf += ' '; 
     pf += s1.peek(); 
     pf += ' '; 
     s1.pop(); 
    } 
    if(check!=0) 
     System.out.println("Syntax Error"); 
    else 
    { 
     System.out.println(pf); 

    } 

} 

誰能幫助我?

+3

我想你應該從轉換邏輯分離第一輸入邏輯。將算法提取到一個方法中,該方法將表達式字符串作爲參數並將轉換後的表達式作爲字符串返回。那麼你可能會看到自己的解決方案! – isnot2bad

+2

你需要多次調用'input.readLine()'。 –

+1

我不同意你的期望;你應該期望'(3 + 4)*(3-1)'產生'34 + 31- *'。你錯過了那個額外的'3'。 – Makoto

回答

2

把你的代碼插入到前綴轉換中的單獨函數中。

public void convert(String s) { 
    String pf = new String(); 
    int i=0, check=0; 
    Stack<Character> s1 = new Stack<>(); 


    while(i<s.length()) 
    { 
     if(isOperand(s.charAt(i))) 
     { 
      pf += s.charAt(i); 
     } 
     else if(isOperator(s.charAt(i))) 
     { 
      while (!s1.empty() && s1.peek() != '(' && compareOperators(s1.peek(),s.charAt(i)) <= 0) 
      { 
       pf += ' '; 
       pf += s1.peek(); 
       s1.pop(); 
      } 
      pf += ' '; 
      s1.push(s.charAt(i)); 
     } 
     else if (s.charAt(i) == '(') 
     { 
      s1.push(s.charAt(i)); 
     } 
     else if (s.charAt(i) == ')') 
     { 
      check++; 
      while (!s1.empty()) 
      { 
       if ((char)s1.peek() == '(') 
       { 
        check--; 
        s1.pop(); 
        break; 
       } 
       pf += ' '; 
       pf += s1.peek(); 
       s1.pop(); 
      } 
     } 
     i++; 
    } 


    while (!s1.empty()) { 
     if(s1.peek()=='(') 
      check--; 
     pf += ' '; 
     pf += s1.peek(); 
     pf += ' '; 
     s1.pop(); 
    } 
    if(check!=0) 
     System.out.println("Syntax Error"); 
    else 
    { 
     System.out.println(pf); 

    } 

} 

然後在主要功能:

public static void main(String args[])throws IOException 
{ 
    BufferedReader input = new BufferedReader (new InputStreamReader(System.in)); 
    String s; 
    while(true) { 
     s = input.readLine(); 
     if (s.equals("0")) 
      break; 
     else 
      convert(s); 
    }  
} 
1

嘗試

String s; 
    while(!(s = input.readLine()).equals("0")){ 

更換

String s = input.readLine(); 

,然後把一個額外的支架在最後。現在,您正在使用(s = input.readLine()讀取每行,並確保它在每次使用之前都不等於0與!s.equals(0)