正确实现堆栈行为

时间:2016-05-11 04:55:41

标签: java stack

我有一个专门用于将堆栈基础知识实现到Web浏览器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 + "]");
        }
    }
}

1 个答案:

答案 0 :(得分:1)

交换你的推/弹顺序,以便在推入堆栈之前退出try / catch:

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) {
    }
}

但是更好的是不要引起异常,而是在弹出之前检查:

if (input.equals("<")) {
    if (!back.isEmpty());
        forward.push(url);
        url = back.pop();
    }
}