Zju1061Web Navigation 网络导航

标准网络浏览所包括的特征是在最近访问过的网页间向后或向前浏览。一种可以实现这些特性的方法是使用两个栈来记录向前或向后可以到达的网页。在这个问题中,你将被要求实现这些特性。
下面的命令是需要浏览器支持的:
BACK:将当前网页压入forward栈顶,弹出backward的栈顶网页,并将其定为新的当前网页。如果backward栈空,则该命令无效。
FORWARD:将当前页压入backward栈顶,弹出forward的栈顶页,并将其定为新的当前网页。如果forward栈空,则该命令无效。
VISIT :将当前页压入backward栈顶,将规定的URL定为新的当前页并且清空forward栈。
QUIT:退出浏览。
假定浏览器最初装载的网页的URL为: http://www.acm.org/

输入
输入文件包含一个命令序列。命令关键字为大写的BACK,VISIT,和QUIT。URL地址没有空格并且至多包含70个字符。你可以假定在任何时刻每个栈中的元素都不超过100个。输入文件以QUIT命令结束。

输出
对每个命令(除了QUIT),如果没有被忽略则输出在执行了命令之后的当前网页的URL;否则输出"Ignored"。每个命令的输出应在与它的输入相对应的一行,且只一行。不会有只包含QUIT命令的输入文件。

样例
输入
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
输出
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

Sol:看到许多人都是用了两个stack,其实没必要。

开个top1代表目前的栈顶指针,top2代表从前曾走过的最远的栈顶指针。

于是如果是先回退后,再前进的话,就可以一直前进,当然top1不能超过top2.

但是注意,如果是回退了一些网站,又重新访问一个网站,则从前的记录要清掉,只要设top2=top1就好了。

#include<bits/stdc++.h>
using namespace std;
string sstack[100000];
int main()
{
    string opt;
    int top1=1,top2=1;
    sstack[1]="http://www.acm.org/";
    while(1)
    {
        bool flag=false;
        cin>>opt;
        if(opt=="VISIT")
        {
            cin>>sstack[++top1];
            top2=top1; 
            //记得top2改为top1的值,这样从前后退的记录清空了 
        }
        if(opt=="BACK")
        {
            if(top1!=1)
                  top1--;
            else
                  flag=true; 
        }
        if(opt=="FORWARD")
        {
            if(top1!=top2) //从前有后退的记录,现在可以向前走 
                top1++;
            else
                flag=1;
        }
        if(opt=="QUIT")
		    return 0;
        if(flag!=true)
             cout<<sstack[top1]<<endl;
        else 
		     puts("Ignored");
    }
}

  

原文地址:https://www.cnblogs.com/cutemush/p/13771552.html