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
添加回答
舉報