3 回答

TA贡献1794条经验 获得超8个赞
使用 Stack 类而不是 ArrayList 会让你的生活更轻松。
使用 push() 将新的 url 添加到堆栈中。
使用 empty() 检查是否可以返回。
使用 pop() 返回。
编辑 - 支持前锋
如果您还想支持“转发”命令,您可以使用第二个堆栈并将您从历史堆栈中弹出的 url 推送到该转发堆栈上。当输入 'forward' 命令时,检查 forward-stack 是否为空,如果不是,则从那里弹出 url 并将其推回历史堆栈。
编辑 2 - 示例代码
这是一些基本代码来解释 2 堆栈解决方案:
Stack<String> historyStack = new Stack<>();
Stack<String> forwardStack = new Stack<>();
String currentUrl = null;
boolean running = true;
while(running) {
String input = getUserInput();
switch(input) {
case "quit":
running = false;
break;
case "back":
if (!historyStack.empty()) {
if (currentUrl != null) {
forwardUrl.push(currentUrl);
}
currentUrl = historyStack.pop();
System.out.println(currentUrl);
} else {
System.out.println("nothing to go back to");
}
break;
case "forward":
if (!forwardStack.empty()) {
if (currentUrl != null) {
historyStack.push(currentUrl);
}
currentUrl = forwardStack.pop();
System.out.println(url);
} else {
System.out.println("nothing to go forward to");
}
break;
default:
if (currentUrl != null) {
historyStack.push(currentUrl);
}
currentUrl = input;
System.out.println(url);
// entering a new url makes forward stack invalid
forwardStack.clear();
}
}

TA贡献1942条经验 获得超3个赞
您可以将逻辑更改为如下:
ArrayList<String> webs = new ArrayList<String>();
String web = "";
Scanner url = new Scanner(System.in);
int count = 0;
while (!web.contains("quit")) {
System.out.println("Enter a URL or \"quit\":");
web = url.next();
if (!web.equals("back")) {
webs.add(web);
count = webs.size();
} else if (web.equals("back") && !webs.isEmpty()) {
if (count > 0) {
count--;
System.out.println(webs.get(count));
} else {
System.out.println("No url to go back to");
}
}
}
请注意以下几点:
我们只添加不等于back的字符串
在您之前的实现中,输入的第一个url没有插入到您的列表中。
将元素添加到列表后,计数将重置为列表的大小。
正如其他人指出的那样,使用堆栈可以更轻松地实现相同的目标
Scanner url = new Scanner(System.in);
String web = "";
Stack<String> myStack = new Stack<>();
while (!web.contains("quit")) {
System.out.println("Enter a URL or \"quit\":");
web = url.next();
if (!web.equals("back") && !web.equals("quit")) {
myStack.push(web);
} else {
if (!myStack.isEmpty()) {
System.out.println(myStack.pop());
} else {
System.out.println("No url to go back to");
}
}
}

TA贡献1805条经验 获得超10个赞
您使用了不正确的数据结构。List可以,但Stack在这里使用更正确:您添加到末尾并从末尾检索,此 id LIFO。
private static final String QUIT = "quit";
private static final String BACK = "back";
try (Scanner url = new Scanner(System.in)) {
Deque<String> stack = new LinkedList<>();
while (true) {
System.out.print("Enter a URL, \"" + BACK + "\" or \"" + QUIT + "\": ");
String str = url.next();
if (str.equalsIgnoreCase(QUIT))
break;
else if (str.equalsIgnoreCase(BACK)) {
if (!stack.isEmpty())
stack.pop();
System.out.println(stack.isEmpty() ? "No URL to go back to" : stack.element());
} else
stack.push(str);
}
}
演示
Enter a URL, "back" or "QUIT": http://www.wwe.com
Enter a URL, "back" or "QUIT": http://www.amazon.com
Enter a URL, "back" or "QUIT": http://www.google.com
Enter a URL, "back" or "QUIT": back
http://www.amazon.com
Enter a URL, "back" or "QUIT": back
http://www.wwe.com
Enter a URL, "back" or "QUIT": back
No URL to go back to
Enter a URL, "back" or "QUIT": quit
添加回答
举报