2013-09-28 46 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)