标准的网页浏览器都提供一个功能:保留最近浏览过页面的历史记录。经过后退或向前按钮就能在历史记录之间跳转。
如今,请你模拟这个功能,接收以下三条指令:
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; } }