2016-05-11 6 views
0

У меня есть класс, предназначенный для реализации основ стека в URL-адресах веб-браузера.Правильная реализация поведения стека

Предполагаемое поведение выглядит следующим образом: Если пользователь вводит URL-адрес в адресную строку, передний стек очищается. Если пользователь нажимает кнопку «Назад», текущий URL-адрес (в адресной строке) помещается в передний стек. Задний стек выталкивается, а всплывающий URL-адрес помещается в адресную строку. Если задний стек пуст, ничего не происходит. Если пользователь нажимает кнопку «вперед», текущий URL-адрес (в адресной строке) помещается в задний стек. Выдвинутый стек выскользнут, а всплывающий URL-адрес помещается в адресную строку Если задний стек назад пуст, ничего не происходит.

В принципе, я столкнулся с проблемой при работе с задним стеклом. Каждый раз, когда вызывается задний блок стека, текущий URL-адрес помещается в передний стек. Хотя это поведение является правильным для одного нажатия заднего стека, оно непреднамеренно, когда задний стек больше не перемещается назад (пример: Google.com [обратный вызов стека] Google.com, толкает Google.com в передний стек дважды) ,

У меня возникли проблемы с мышлением о логике, чтобы это не произошло. Очевидно, что некорректное поведение требует многократного нажатия на передний стек, чтобы переместить только одну веб-страницу.

Любые предложения, сохраняя мою суть моего кода целым?

public class BrowserStack { 

    public static void main(String[] args) { 

     Scanner s = new Scanner(System.in); 

     // the current URL 
     String url = null; 

     Stack<String> forward = new Stack<String>(); 
     Stack<String> back = new Stack<String>(); 

     String input; 
     System.out.println("Type a combination of URLs, or the > or < symbol.\nType 'q' to quit."); 

     while (true) { 

      input = s.next(); 

      if (input.equals("q")) { 
       System.out.println("Bye"); 
       return; 
      } 

      if (input.equals("<")) { 
       try { 
        forward.push(url); //unintended behavior happens here 
        url = back.pop(); 
       } catch (EmptyStackException e) { 
       } 
      } 

      else if (input.equals(">")) { 
       try { 
        back.push(url); 
        url = forward.pop(); 
       } catch (EmptyStackException e) { 
       } 
      } 

      else { 
       if (url != null) 
        back.push(url); 
       url = input; 
       forward.clear(); 
      } 
      System.out.println("Current webpage [" + url + "]"); 
     } 
    } 
} 
+0

где вы заселяете 'url'? – Helios

+0

@Helios в выражении 'else' внизу,' url = input' – 23k

+0

Под «задним стеком больше не движется назад» вы имеете в виду, что он пуст (или имеет только один элемент)? И не было бы лучше явно проверить пустое() вместо обработки EmptyStackException? –

ответ

1

переставить тяни/поп порядок, так что вы выходите из TRY/поймать до нажатия на стек:

if (input.equals("<")) { 
    try { 
     String temp = url; 
     url = back.pop(); 
     forward.push(temp); // this only executes if the last line completed unexceptionally 
    } catch (EmptyStackException e) { 
    } 
} 

Но было бы правильнее не вызвать исключение вообще, а проверить перед popping:

if (input.equals("<")) { 
    if (!back.isEmpty()); 
     forward.push(url); 
     url = back.pop(); 
    } 
} 
Смежные вопросы