標準的網頁瀏覽器都提供一個功能:保留最近瀏覽過頁面的歷史記錄。經過後退或向前按鈕就能在歷史記錄之間跳轉。
如今,請你模擬這個功能,接收以下三條指令:
1. BACK:回退功能,即回退到上一個訪問的頁面;
2. FORWARD:使用BACK返回上一頁以後,能夠使用FORWARD回到下一頁;
3. VISIT url:訪問指定url的頁面,而且全部FORWARD的頁面都被清空。 java
輸入包含多組數據,每組數據第一行包含一個正整數n(1≤n≤100)。
緊接着有n行,每一行包含一條指令。其中url是不包含空格、長度不超過100的非空字符串。 算法
對應每組數據,爲每條指令輸出當前頁面的URL。
若是當前指令無效(例如沒有上一頁時執行BACK指令、或沒有下一頁時執行FORWARD指令),則輸出一行「ignore」。
每組數據以後輸出一個空行做爲分隔。瀏覽器
13 VISIT http://www.acm.org/ VISIT http://acm.ashland.edu/ VISIT http://acm.baylor.edu/acmicpc/ BACK BACK BACK FORWARD VISIT http://www.ibm.com/ BACK BACK FORWARD FORWARD FORWARD
http://www.acm.org/ http://acm.ashland.edu/ http://acm.baylor.edu/acmicpc/ http://acm.ashland.edu/ http://www.acm.org/ ignore http://acm.ashland.edu/ http://www.ibm.com/ http://acm.ashland.edu/ http://www.acm.org/ http://acm.ashland.edu/ http://www.ibm.com/ ignore
題目比較簡單見代碼註釋。測試
import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * Declaration: All Rights Reserved !!! */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNext()) { int n = scanner.nextInt(); List<String> visit = new ArrayList<>(n); for (int i = 0; i < n; i++) { String s = scanner.next(); visit.add(s); // 若是是訪問頁面就再讀取訪問的頁面RUL if ("VISIT".equals(s)) { visit.add(scanner.next()); } } List<String> result = history(visit); for (String url : result) { System.out.println(url); } System.out.println(); } scanner.close(); } /** * 記錄瀏覽歷史 * * @param visit 訪問序列,爲VISIT、BACK和FORWARD。若是是VISIT後面會一個就是直接訪問的RUL * @return 訪問的頁面URL */ private static List<String> history(List<String> visit) { List<String> result = new ArrayList<>(); // 記錄訪問的歷史頁面 List<String> history = new ArrayList<>(visit.size()); // 記錄上一個訪問的頁面位置 int prev = -1; for (int i = 0, j = visit.size(); i < j; i++) { String act = visit.get(i); if ("VISIT".equals(act)) { // 取URL i++; String url = visit.get(i); // 移除上一個頁面的全部FROWARD頁面 while (history.size() > prev + 1) { history.remove(history.size() - 1); } prev++; history.add(url); result.add(history.get(prev)); } else if ("BACK".equals(act)) { if (prev <= 0) { result.add("ignore"); } else { prev--; result.add(history.get(prev)); } } else if ("FORWARD".equals(act)) { if (prev + 1 >= history.size()) { result.add("ignore"); } else { prev++; result.add(history.get(prev)); } } } return result; } }