2014-01-04 3 views
0

Я реализую алгоритм шунтирования, и у меня возникают проблемы с скобками. Тем не менее, он отлично работает с негрупповыми выражениями. Вот что у меня есть без обнаружения скобки:Не удалось добавить обработку скобок в моей реализации Shunting yard

public void makePost(String e) 
{ 
    String[] arr = e.split(""); 
    for(int i = 0; i < arr.length; i++) 
    { 
     if(arr[i].equals(" ")) 
     { 
      continue; 
     } 
     Operator o = OperatorList.getOpMap().get(arr[i]); 
     if(o == null){ 
      postfix += " " + arr[i]; 
      continue; 
     } 
     if(ops.isEmpty()){ 
      ops.push(o); 
      continue; 
     } 
     else 
     { 

      while((!ops.isEmpty() && (ops.peek().getPresedence() <= o.getPresedence()))){ 
       postfix += " " + ops.pop(); 
      } 
      ops.push(o); 
      continue; 
     } 

    } 
    while(!ops.isEmpty()) 
    { 
     postfix += " " + ops.pop(); 
    } 
    postfix = postfix.trim(); 

} 

OPS является стек, который содержит объекты Оператора. Есть два типа операторов: функции (+, -, * и т. Д.) И Parans ("(", "["). Как бы вы добавили к этому обработку скобок? Каждый раз, когда я пытаюсь, она работала правильно

Вот что я пробовал:..

public void makePost(String e) 
{ 
    String[] arr = e.split(""); 
    for(int i = 0; i < arr.length; i++){ 
     if(arr[i].equals(" ")){ 
      continue; 
     } 
     Operator o = OperatorList.getOpMap().get(arr[i]); 
     if(o == null){ 
      postfix += " " + arr[i]; 
      continue; 
     } 
     if(ops.isEmpty()){ 
      ops.push(o); 
      continue; 
     } 
     else 
     { 
      if(o.isParan()) 
      { 
       Paran p = new Paran(o.toString()); 
       if(p.isOpen()) 
       { 
       ops.push(o); 
       System.out.println(ops); 
       continue; 
       }else{  
        while(!ops.isEmpty()){ 
         if(ops.peek().isParan()){ 
          Paran n = new Paran(o.toString()); 
          if(n.isOpen()){ 
           ops.pop(); 
           break; 
          } 
         } 
         postfix += " " + ops.pop(); 
        } 
        continue; 
       } 
      } 
      while((!ops.isEmpty() && (ops.peek().getPresedence() <= o.getPresedence()))){ 
       postfix += " " + ops.pop(); 
      } 
      ops.push(o); 
      continue; 
     } 

    } 
    while(!ops.isEmpty()) 
    { 
     postfix += " " + ops.pop(); 
    } 
    postfix = postfix.trim(); 

} 

Я подозреваю, что состояние в то время как петля плохо, но я не знаю ни одной правильной замены Это продолжается до бесконечности Это было чистая реализация, которую я имел. В основном то, что она должна делать, - это когда она встречает открытую круглую скобку, толкает ее в стек. Когда она попадает в закрытую, выталкивайте все из стека на вывод, пока он не попадет в открытую круглую скобку. должен сломаться и перейти к следующему знаку.

if(o.isParan()) 
      { 
       Paran p = new Paran(o.toString()); 
       if(p.isOpen()) 
       { 
       ops.push(o); 
       System.out.println(ops); 
       continue; 
       }else{  
        while(!ops.isEmpty()){ 
         if(ops.peek().isParan()){ 
          Paran n = new Paran(o.toString()); 
          if(n.isOpen()){ 
           ops.pop(); 
           break; 
          } 
         } 
         postfix += " " + ops.pop(); 
        } 
        continue; 
       } 

EDIT: добавлена ​​моя попытка

+1

Как бы то ни было, этот вопрос представляется «пожалуйста, сделайте мою домашнюю работу для меня». Я подозреваю, что он получит лучший прием, если вы покажете, что вы попробовали, и объясните, почему вы думаете, что он должен работать ... – GreenAsJade

+0

Это не домашнее задание, но я могу добавить свои попытки –

+1

Я думаю, что это добавит доверия к вопросу, чтобы показать что-то из того, что вы пытались, что не сработало - да, пожалуйста. Вы также можете очистить многие другие вопросы StackOverflow о Shunting Yard :). Прямо сейчас, в верхней части списка справа от меня, вопрос о сохранении парнеров в Shunting Yard;) – GreenAsJade

ответ

0

Понял работать! Я добавил несколько проверок для круглых скобках в логических областях, Вот окончательный:

public void makePost(String e) 
{ 
    String[] arr = e.split(""); 
    for(int i = 0; i < arr.length; i++) 
    { 

     System.out.println(postfix + " " + i + " " + ops); 
     if(arr[i].equals(" ")) 
     { 
      continue; 
     } 
     if(arr[i].equals("(")){ 
      ops.push(new Paran("(")); 
      continue; 
     } 
     if(!ops.isEmpty() && arr[i].equals(")")){ 
      while(!ops.isEmpty() && !ops.peek().isOpen()){ 

       postfix += " " + ops.pop(); 
      } 
      ops.pop(); 
     } 
     Operator o = OperatorList.getOpMap().get(arr[i]); 
     if(o == null){ 
      postfix += " " + arr[i]; 
      continue; 
     } 
     if(ops.isEmpty()){ 

      ops.push(o); 

      continue; 
     } 
     else 
     { 

      while((!ops.isEmpty() && (ops.peek().getPresedence() <= o.getPresedence()) && !(ops.peek() instanceof Paran))){ 

       postfix += " " + ops.pop(); 
      } 
      ops.push(o); 
      continue; 

     } 

    } 

    while(!ops.isEmpty()) 
    { 

     postfix += " " + ops.pop(); 
    } 

    postfix = postfix.replaceAll("\\s[)]",""); 


} 

У меня есть вызов replaceall(), так как выход продолжал обратный закрывающую скобку вместе с corrent постфикса, экс:

2 4 * 7 8 4 * 4 4 5 *) /) *) + 

Я понятия не имею, почему это так, но я рад, что это работает

+1

Я предполагаю, что левые парсеры оставлены, потому что OperatorList.getOpMap.get ("(") имеет значение null. Просто предположите. Вы можете захотеть добавить некоторые комментарии, которые вам помогли;) GaJ – GreenAsJade

+0

Это не null, я проверил. Я все-таки проголосовал за всех :) –

+0

Huh! Это верно, как причина :) – GreenAsJade