3 回答
TA贡献1816条经验 获得超4个赞
使用 Stack 类而不是 ArrayList 会让你的生活更轻松。
使用 push() 将新的 url 添加到堆栈。
使用 empty() 检查是否可以返回。
使用 pop() 返回。
编辑 - 支持转发
如果您还想支持“转发”comand,则可以使用第二个堆栈,并将从该转发堆栈上的历史堆栈中弹出的URL推送。输入“forward”命令时,检查正向堆栈是否为空,如果没有,请从那里弹出 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贡献1833条经验 获得超4个赞
您可以将逻辑更改为如下所示:
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贡献1876条经验 获得超7个赞
您使用了不正确的数据结构。 是可以的,但在这里使用更正确:你添加到末尾并从末尾检索,这个id LIFO。ListStack
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
添加回答
举报
