2014-03-02 6 views
0

필자의 중위 점을 포스트 픽스 코드로 만들려고했는데, 중괄호없이 작동하지만, 중괄호를 차지할 부분을 포함 시키려고하면, 코드의 주요 부분이 충돌한다. :내 인피니드 코드가 작동하지 않는다

for (i=0; i<characters.length; i++) 
{ 
    if (characters[i]=='*' || characters[i]=='/' || characters[i]=='+' || characters[i]=='-' || characters[i]=='(' || characters[i]==')'){ 
     if (postfix.empty() && characters[i]!=')') 
      postfix.push(characters[i]); 
     else if (!postfix.empty()){ 
      if (characters[i]=='(') 
       postfix.push(characters[i]); 
      if (characters[i]=='*' || characters[i]=='/') 
       priority2=1; 
      if (characters[i]=='+' || characters[i]=='-') 
       priority2=0; 
      if (characters[i]==')'){ 
       while (postfix.peek()!='(') //loop until we see the closing bracket 
        System.out.print(postfix.pop()); //pop everything till we see the closing bracket 
       postfix.pop(); //to pop the bracket 
      } 
      if (!postfix.empty()) 
       peeked=postfix.peek(); 
      if (peeked=='*' || peeked=='/') 
       priority=1; 
      if (peeked=='+' || peeked=='-') 
       priority=0; 
      if (priority2>priority) 
       postfix.push(characters[i]); 
      else{ 
       while (!postfix.empty()) 
        System.out.print(postfix.pop()); 
       postfix.push(characters[i]); 
      }  
     } 
    } 
    else 
     System.out.print(characters[i]);  
} 
while (!postfix.empty()) 
    System.out.print(postfix.pop()); 

도움이 되셨습니까? 그것은 중괄호에 관해서는 휴식.

+1

자신의 코드를 _really_ 디버깅해야합니다. –

+0

나는 시도했다. 나는 여러 번 지나갔다. 나는 그것들이 터지기 전에 (인쇄하기 전에) 여전히 중괄호를 인쇄하는 이유를 알지 못한다. – user2883071

+0

디버거를 다운로드하여 사용한다. –

답변

0

이러한 변환을 수행하기위한 표준 알고리즘을 기반으로하는 Infix To Postfix 프로그램을 구현하여 통찰력을 얻을 수 있습니다. 여기에 있습니다 :

import java.util.Scanner; 
import java.util.Stack; 

public class InfixPostfix 
{ 
    private Stack<Character> stack; 
    private StringBuilder postfixExpression; 

    public InfixPostfix() 
    { 
    stack = new Stack<>(); 
    postfixExpression = new StringBuilder(); 

    String infix = getInfixExpression(); 

    if (isValidInfix(infix)) 
    { 
     System.out.println(convertToPostfix(infix)); 
    } 
    else 
    { 
     System.out.println("Invalid Expression"); 
    } 
    } 

    private boolean isValidInfix(String infix) 
    { 
    int parenthesisCounter = 0; 
    for (int i = 0; i < infix.length(); i++) 
    { 
     char ch = infix.charAt(i); 
     if (ch == '(') 
     parenthesisCounter++; 
     else if (ch == ')') 
     parenthesisCounter--; 

     if (parenthesisCounter < 0) 
     return false; 
    } 
    if (parenthesisCounter == 0) 
     return true; 
    return false; 
    } 

    private String convertToPostfix(String infix) 
    { 
    for (int i = 0; i < infix.length(); i++) 
    { 
     char ch = infix.charAt(i); 

     switch (ch) 
     { 
     case '+': 
     case '-': 
      processOperatorOfPrecedence(ch, 1); 
      break; 
     case '*': 
     case '/': 
      processOperatorOfPrecedence(ch, 2); 
      break; 
     case '(': 
      stack.push(ch); 
      break; 
     case ')': 
      processParenthesis(ch); 
      break; 
     default: 
      postfixExpression.append(ch); 
      break; 
     } 
    } 

    while (!stack.isEmpty()) 
    { 
     postfixExpression.append(stack.pop()); 
    } 

    return postfixExpression.toString(); 
    } 

    private void processOperatorOfPrecedence(char operator, int precedence) 
    { 
    while (!stack.isEmpty()) 
    { 
     char topOperator = stack.pop(); 

     if (topOperator == '(') 
     { 
     stack.push(topOperator); 
     break; 
     } 
     else 
     { 
     int operatorPrecedence; 

     if (topOperator == '+' || topOperator == '-') 
      operatorPrecedence = 1; 
     else 
      operatorPrecedence = 2; 

     if (operatorPrecedence < precedence) 
     { 
      stack.push(topOperator); 
      break; 
     } 
     else 
      postfixExpression.append(topOperator); 
     } 
    } 
    stack.push(operator); 
    } 

    private void processParenthesis(char ch) 
    { 
    while (!stack.isEmpty()) 
    { 
     char character = stack.pop(); 

     if (character == '(') 
     break; 
     else 
     postfixExpression.append(character); 
    } 
    } 

    private String getInfixExpression() 
    { 
    Scanner scanner = new Scanner(System.in); 
    System.out.println("Enter an infix math expression: "); 
    String input = scanner.nextLine(); 
    scanner.close(); 
    return input; 
    } 

    public static void main(String[] args) 
    { 
    new InfixPostfix(); 
    } 
} 
+0

두 번 스캔 할 필요가 없습니다. 유효성을 확인하려면 한 번, 구문을 분석하려면 한 번 더 스캔 할 필요가 없습니다. 동시에 수행 할 수 있으며 '표준 알고리즘', 즉 Dijkstra Shunting-yard 알고리즘이 그렇게합니다. – EJP