【問題描述】
標準的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.baylor.edu/acmicpc/
Ignored
Ignored
思路:
將第n個訪問過的網站看做第n個暗箱。箱子不變,但箱子裏裝的東西有可能變(前進+後退+突然VISIT訪問了其它網站改變了順序,頂替了原來這個箱子裏面的網站。此時全新的順序產生,並且原來此位置以後的箱子全部清空,原來存儲的網站無效)
#include<iostream>
using namespace std;
int main()
{
string visited[100];
int step=0;
int flag[100]={0};
int cnt=1;
visited[0]="http://www.game.org/";
flag[0]=1;
string str;
while(getline(cin,str)&&str!="QUIT")
{
if(str.substr(0,5)=="VISIT")
{
step++;
if(flag[step]==0)
{
int len=str.length();
visited[step]=str.substr(6,(len-6));
cout<<visited[step]<<endl;
flag[step]=1;
cnt++;
}
else
{
int len=str.length();
visited[step]=str.substr(6,(len-6));
cout<<visited[step]<<endl;
for(int i=step;i<cnt;i++)
{
flag[i]=0;
}
flag[step]=1;
cnt=step+1;
}
}
else if(str=="BACK")
{
step--;
if(step>=0)
{
cout<<visited[step]<<endl;
}
else
{
step++;
cout<<"Ignored"<<endl;
}
}
else if(str=="FORWARD")
{
step++;
if(step<=(cnt-1))
{
cout<<visited[step]<<endl;
}
else
{
step--;
cout<<"Ignored"<<endl;
}
}
}
return 0;
}