题目
【问题描述】
标准的Web浏览器具有在最近访问的页面中前后移动的特性。实现这些特性的一种方法是使用两个堆栈来跟踪可以通过前后移动到达的页面。在这个问题中,我们要求实现这一点。
需要支持以下命令:
BACK:将当前页面压入前向堆栈的顶部;从后向堆栈的顶部弹出该页,使其成为新的当前页。如果后向堆栈为空,则该指令忽略。
FORWARD:将当前页面压入后向堆栈的顶部;从前向堆栈的顶部弹出该页,使其成为新的当前页。如果前向堆栈为空,则该指令忽略。
VISIT:将当前页面压入后向堆栈的顶部,将URL指定为新的当前页。前向堆栈被清空。
QUIT:退出浏览器。
假设浏览器最初在网址http://www.game.org/上加载网页。
【输入形式】输入是一个命令序列。命令关键字BACK、FORWARD、VISIT和QUIT都是大写。URL中无空格,最多有70个字符。假定在任何时候,每个堆栈中没有问题实例需要超过100个元素。输入的结尾由QUIT命令标识。
【输出形式】除QUIT外的每个命令,如果命令没有被忽略,则在命令执行后输出当前页面的URL,否则,打印"Ignored"。每个命令的输出独立打印一行。QUIT命令无输出。
【样例输入】
VISIT http://game.ashland.edu/
VISIT http://game.baylor.edu/acmicpc/
BACK
BACK
BACK
FORWARD
VISIT http://www.our.com/
BACK
BACK
FORWARD
FORWARD
FORWARD
QUIT
【样例输出】
http://game.ashland.edu/
http://game.baylor.edu/acmicpc/
http://game.ashland.edu/
http://www.game.org/
Ignored
http://game.ashland.edu/
http://www.our.com/
http://game.ashland.edu/
http://www.game.org/
http://game.ashland.edu/
http://www.our.com/
Ignored
【样例说明】
【评分标准】
答案
#include<bits/stdc++.h>
using namespace std;
stack<string>f,b;
int main()
{
string s;
string url="http://www.game.org/";
while(cin>>s)
{
if(s=="QUIT") break;
if(s[0]=='V')
{
b.push(url);
cin>>url;
cout<<url<<endl;
while(f.size()) f.pop(); //这就是清空栈的方法吗?
}
else if(s[0]=='B')
{
if(b.size())
{
f.push(url);
url=b.top();
cout<<url<<endl;
b.pop(); //移除栈顶元素
}
else cout<<"Ignored"<<endl;
}
else if(s=="FORWARD")//前进命令
{
if(f.size())//如果前向堆栈不为空
{
b.push(url);//将当前页面压入后向堆栈
url=f.top();//更新当前页面
cout<<url<<endl;//输出当前页面
f.pop();//弹出前向堆栈储存的页面
}
else cout<<"Ignored"<<endl;//若前向堆栈为空,输出Ignore
}
}
return 0;
}
/**
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
***/
突然的附加小知识
//sum+=(int)s[i] 是错误的…
sum+=(s[i]-‘0’); 对