题目:
VISIT打开界面,BACK回退,FORWARD前进。
现在输入n行,每行首先输入一个字符串,如果是VISIT,后面再输入一行不含空格的网址,如果是BACK,回退,如果是FORWARD,前进。
对每次操作,如果能操作成,输出操作后的网址,否则输出Ignore。
这里回退的意思是返回上一次访问的网页,前进意思是返回回退之前的网页。如果回退上一次操作是打开网页,那么无法前进。也就是说,每次打开网页后的下一个操作不能是回退。
输入:
10
VISIT https://www.126.com/
VISIT https://www.taobao.com/
BACK
BACK
FORWARD
FORWARD
BACK
VISIT https://www.163.com/
FORWARD
BACK
输出:
https://www.126.com/
https://www.taobao.com/
https://www.126.com/
Ignore
https://www.taobao.com/
Ignore
https://www.126.com/
https://www.163.com/
Ignore
https://www.126.com/
分析与解答:
打开网页入栈,回退栈顶元素出栈,如果栈里面只有一个元素,也就是说只打开了一个界面也是无法回退的。由于还需要前进,所以这里还要加一个栈,存出栈的元素。由题目要求每次打开网页,都要把这个栈给清空。这里为什么加一个栈而不是数组,是因为距离的问题,最近的最先出去,先出去的网站一定不是最近的那个网站。
然后根据要求进行模拟即可。输出存放网站的栈的栈顶元素即是当前网页。
#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
#include<string>
using namespace std;int main(){int n;cin>>n;stack<string> k1;stack<string> k2;for(int i=0;i<n;++i){string s;cin>>s;if(s=="VISIT"){string s2;cin>>s2;k1.push(s2);while(!k2.empty()){k2.pop();}// cout<<s2<<endl;;}else if(s=="BACK"){if(k1.size()>1) {k2.push(k1.top());k1.pop();}else{cout<<"Ignore"<<endl;continue;}}else{if(!k2.empty()){// cout<<k2.top()<<endl;k1.push(k2.top());k2.pop();}else{cout<<"Ignore"<<endl;continue;}}cout<<k1.top()<<endl;}return 0;
}