-为什么不是“解题报告”?
-因为这次完全没参考任何题解!
题目大意:
标准的 w e b web web浏览器靠两个栈来实现页面轮换。要求实现下列命令:
- B A C K BACK BACK:返回后一页面,如果没有则输出“ I g n o r e d Ignored Ignored”。
- F O R W A R D FORWARD FORWARD:返回前一页面,如果没有则输出“ I g n o r e d Ignored Ignored”。
- V I S I T VISIT VISIT:访问新的网址,同时清空 F O R W A R D FORWARD FORWARD记录。
- Q U I T QUIT QUIT:结束程序,关闭浏览器,啥也不用输出。
- 对每次操作都要输出操作之后的当前页面。
初始页面为http://www.acm.org/
。
分析:
根据题意用两个
s
t
r
i
n
g
string
string类型的栈来维护网页情况,
s
1
s1
s1存
B
A
C
K
BACK
BACK,
s
2
s2
s2存
F
O
R
W
A
R
D
FORWARD
FORWARD。初始时
s
1
s1
s1内有且仅有元素http://www.acm.org/
,
s
2
s2
s2为空。做法直接依照题意模拟即可。
- 读入 B A C K BACK BACK时,弹出 s 1 s1 s1顶部元素放入 s 2 s2 s2,再输出 s 1. t o p ( ) s1.top() s1.top()。如果 s 1. s i z e ( ) s1.size() s1.size()为 1 1 1(即仅剩初始页面)则不操作并输出“ I g n o r e d Ignored Ignored”。
- 读入 F O R W A R D FORWARD FORWARD时,弹出 s 2 s2 s2顶部元素放入 s 1 s1 s1,再输出 s 1. t o p ( ) s1.top() s1.top()。如果 s 2. e m p t y ( ) s2.empty() s2.empty()为 真 真 真(即没有前驱页面时)则不操作并输出“ I g n o r e d Ignored Ignored”。
- 读入 V I S I T VISIT VISIT时,清空所有前驱页面(即清空 s 2 s2 s2),再读入一个新的页面并加入 s 1 s1 s1。之后输出 s 1. t o p ( ) s1.top() s1.top()。
- 读入 Q U I T QUIT QUIT时,结束程序。
贴代码:
#pragma GCC optimize(2)
#include<stack>//C++ stl栈
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
stack<string>s1,s2;//定义string类型的两个栈
string tmp;//转移页面时的中介
int main(){
char opt[10];//操作类型
s1.push("http://www.acm.org/");//初始页面放入s1
while(scanf("%s",opt)){//一直读
if(opt[0]=='Q')break;//读到QUIT就跳出
if(opt[0]=='V'){//如果是“VISIT”
while(!s2.empty())s2.pop();//清空s2
cin>>tmp;//访问新页面
s1.push(tmp);//加入它
cout<<s1.top()<<endl;//输出当前页面
}else if(opt[0]=='B'){//如果是“BACK”
if(s1.size()==1){printf("Ignored\n");continue;}//如果当前在初始页面(没有历史页面了)就忽略掉
else{
tmp=s1.top();s1.pop();
s2.push(tmp);//否则将当前页面放入s2中,成为新的前驱页面
cout<<s1.top()<<endl;//输出当前页面
}
}else if(opt[0]=='F'){//如果是“FORWARD”
if(s2.empty()){printf("Ignored\n");continue;}//如果已经不存在前驱页面则忽略
else{
tmp=s2.top();s2.pop();
s1.push(tmp);//否则将前驱页面弄回s1来
cout<<s1.top()<<endl;//输出当前页面
}
}
}
return 0;//完结撒花
}