题目地址:http://poj.org/problem?id=1028
测试样例:
Sample Input
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 QUIT
Sample Output
http://acm.ashland.edu/ http://acm.baylor.edu/acmicpc/ http://acm.ashland.edu/ http://www.acm.org/ Ignored http://acm.ashland.edu/ http://www.ibm.com/ http://acm.ashland.edu/ http://www.acm.org/ http://acm.ashland.edu/ http://www.ibm.com/ Ignored
题目分析:
指令操作:
需要支持如下命令:
BACK:把当前页面放入“前进栈”的最顶部,并从“后退栈”中取出顶部元素,使其为当前浏览页面。如果“后退栈”为空,则忽略当前操作。
FORWARD:把当前页面放入“后退栈”的最顶部,并从“前进栈”中取出顶部元素,使其为当前浏览页面。如果“前进栈”为空,则忽略当前操作。
VISIT :将当前页面放入后退栈的顶部,并设置URL为当前指定页面。前进栈设置为空。
QUIT:退出浏览器。
假设浏览器初始登入URL网页:http://www.acm.org/
注意:当你BACK 或者 FORWARD 的时候,如果要转换的页面不存在,需要输出Ignored 的时候,不要把当前的页面加入 前进栈 或者 后退栈。
除非要转换的页面存在,才将当前的页面 加入前进栈或者后退栈。
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <stack> #include <queue> #include <iostream> #include <string> #include <algorithm> using namespace std; int main() { stack<string>s_back; //后退栈 stack<string>s_forw; //前进栈 //假设浏览器初始登入URL网页:http://www.acm.org/ string instruct; //操作指令 string cur="http://www.acm.org/";//当前开始页面 string temp; while(cin>>instruct ) { if(instruct=="QUIT") break; if(instruct=="VISIT") //执行此指令后要将当前页面加入后退栈 { //遇到访问新的页面 //并且前进栈要清空 cin>>temp; s_back.push(cur); //加入后退栈 cur=temp; cout<<cur<<endl; while(!s_forw.empty()) s_forw.pop(); } if(instruct=="BACK") { if(!s_back.empty()){ s_forw.push(cur);//将当前页面加入前进栈 注意:要包含在if语句内 否则会错 cur=s_back.top(); s_back.pop();//不要忘记出栈 cout<<cur<<endl; } else printf("Ignored "); } if(instruct=="FORWARD") { if(!s_forw.empty()){ s_back.push(cur); // 注意:要包含在if语句内 否则会错 cur=s_forw.top(); s_forw.pop(); cout<<cur<<endl; } else printf("Ignored "); } } return 0; }