2015-04-15 3 views
0

, работающий над программой, которая преобразует инфиксную нотацию в постфикс. Я использую его для большинства случаев, кроме случаев, когда требуется конкатенация символов. Например, если я передаю строку чисел (1002 + 304), она выдает 1, 0, 0, 2, 3, 0, 4, + вместо 1002, 304, +.Инфикс для постфиксной цифры или конкатенации

import java.util.*; 


public class InfixToPostfix { 

    private Deque<String> postfix; // Used as a queue of String 


    private static boolean isOperator(char op) 
    { 
     if(op=='+'||op=='-'||op=='*'||op=='/'||op=='^' 
       ||op=='('||op==')') 
     { 
      return true; 
     } 
     return false; 
    } 

    private static boolean lowerEqualPrec(char op1, char op2) 
    { 
     boolean flag = false; 
     if(op1=='+'|| op1=='-') 
     { 
      if(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2=='^') 
      { 
       flag= true; 
      } 
     }else if(op1=='*' || op1=='/') 
     { 
      if(op2=='*'||op2=='/'||op2=='^') 
      { 
       flag= true; 
      } 
     }else if(op1=='^') 
     { 
      flag= false; 
     }else if(op1=='(') 
     { 
      flag= false; 
     } 
     return flag; 
    } 

    public InfixToPostfix(String infix) 
    { 
     for(int i=0; i<infix.length(); i++) 
     { 
      if(infix.length() ==0 || infix.charAt(0)==')' || 
        infix.charAt(i)=='&' || infix.charAt(infix.length()-1)=='(') 
      { 
       throw new IllegalArgumentException(); 
      } 
     } 

     postfix = new LinkedList<String>(); 
     Stack<Character> stack = new Stack<Character>(); 
     Character ch; 
     String digits=""; 
     String letters = ""; 


     for(int i=0; i<infix.length(); i++) 
     { 
      ch=infix.charAt(i); 
      if(ch == ' ') 
      { 
       //do nothing 
      } 

      if(Character.isDigit(ch)) 
      { 

       digits=""+ch; 
       if(i+1 >= infix.length() || !Character.isDigit(infix.charAt(i+1))) 
       { 
        digits=digits+""; 
       } 
       postfix.add(digits); 


      } 
      if(Character.isLetter(ch)) 
      { 
       letters=ch+""; 

       postfix.add(letters); 

      } 

      if(isOperator(ch)) 
      { 
       if(ch == ')') 
       { 

        if(!stack.isEmpty() && stack.peek() != '(') 
        { 
         postfix.add(""+stack.pop()); 
         if(!stack.isEmpty()) 
         { 
          stack.pop(); 
         } 
        } 
       } 

       else 
       { 

        if(!stack.isEmpty() && !lowerEqualPrec(ch, stack.peek())) 
        { 
         stack.push(ch); 
        } 

        else 
        { 
         while(!stack.isEmpty() && lowerEqualPrec(ch, stack.peek())) 
         { 
          char pop = stack.pop(); 
          if(ch!='(') 
          { 
           postfix.add(pop+""); 
          } 
         } 

         stack.push(ch); 
        } 
       } 
      } 
     } 
     while(!stack.isEmpty()&&stack.peek()!='(') 
     { 
      postfix.add(stack.pop()+""); 
     } 
     System.out.println(postfix); 
    } 

    public Iterator<String> iterator() 
    { 
     return new PostfixIterator(postfix) ; 
    } 

    public static void main(String[] args) 
    { 
     InfixToPostfix test = new InfixToPostfix("1002+304"); 
    } 

} 
+0

Что такое PostfixIterator? Можете ли вы опубликовать код для этого? –

+0

Почему все эти хлопоты с конкатенацией строк? Сначала преобразуйте в список целых чисел и операторов. Затем замените заказ соответствующим образом. Затем напечатайте его строковое представление. – wvdz

ответ

-1

Для postfixConversion

public static String postfixConversion(String input) { 

     int i; 
     String postfix = ""; 

     Stack<Character> stack = new Stack<Character>(); 

     for (i = 0; i < input.length(); i++) { 
       while (input.charAt(i) == ' ') { 
         ++i; 
       } 

       if (Character.isDigit(input.charAt(i))) { 
           postfix += input.charAt(i); 

           //if (!Character.isDigit(input.charAt(i+1))) { 
             postfix += ' '; 
           //} 
       } 

       else if (precedenceLevel(input.charAt(i)) != 0) { 
         while ((!stack.isEmpty()) && (precedenceLevel(stack.peek()) >= precedenceLevel(input.charAt(i))) && (stack.peek() != '(')) { 
           postfix += stack.peek(); 
           postfix += ' '; 
           stack.pop(); 
         } 

         stack.push(input.charAt(i)); 
       } 

       else if (input.charAt(i) == '(') { 
         stack.push(input.charAt(i)); 
       } 

       else if (input.charAt(i) == ')') { 
         while (!stack.isEmpty() && stack.peek() != '(') { 
           postfix += stack.peek(); 
           stack.pop(); 
         } 

         stack.pop(); 
       } 
     } 

     while (!stack.isEmpty()) { 
       postfix += stack.peek(); 
       postfix += ' '; 
     } 

     return postfix; 

} 
+0

Не думайте, что OP хочет альтернативного решения, я думаю, он хочет знать, почему его решение не работает. –