ZOJ1061 Web Navigation

原始版本:
#include < iostream >
#include
< stack >
#include
< string >
using namespace std;

void ClearStack(stack < string >& s)
{
// 清空栈
while ( ! s.empty())
{
s.pop();
}
}
int main( void )
{
string command,newURL;
int n,cases,i;
cin
>> n;
for (cases = 1 ;cases <= n; ++ cases)
{
stack
< string > forwardStack,backwardStack; // 前进栈,后退栈
string curURL = " http://www.acm.org/ " ; // 当前访问页面
if (cases != 1 )
{
cout
<< endl;
}
while (cin >> command)
{
// 读入一行命令
if (command[ 0 ] == ' Q ' )
{
// 退出
break ;
}
else if (command[ 0 ] == ' B ' )
{
// 退后
if ( ! backwardStack.empty())
{
// 退后栈中有历史记录
forwardStack.push(curURL); // 当前页面进入前进栈
// 从退出栈中栈顶取出页面为当前页面
curURL = backwardStack.top();
cout
<< curURL << endl;
backwardStack.pop();
}
else
{
cout
<< " Ignored " << endl;
}
}
else if (command[ 0 ] == ' V ' )
{
// 访问新URL
backwardStack.push(curURL); // 当前页面进入后退栈
cin >> curURL;
cout
<< curURL << endl;
ClearStack(forwardStack);
// 情况前进栈
}
else if (command[ 0 ] == ' F ' )
{
// 前进
if ( ! forwardStack.empty())
{
// 前进栈中有历史记录
backwardStack.push(curURL); // 当前页面进入后退栈
// 从前进栈中栈顶取出页面为当前页面
curURL = forwardStack.top();
cout
<< curURL << endl;
forwardStack.pop();
}
else
{
cout
<< " Ignored " << endl;
}
}
}
}
return 0 ;
}

重构后的版本:


#include
< iostream >
#include
< stack >
#include
< string >
using namespace std;

class WebNavigation
{
private :
string curURL; // 当前访问页面
string command; // 当前待处理的命令
stack < string > forwardStack,backwardStack; // 前进栈,后退栈
bool isFinished; // 是否处理完毕

void ClearStack(stack < string >& s); // 清空栈
void Back(); // 退后
void Forward(); // 向前
void Visit(); // 访问新URL
public :
WebNavigation();
~ WebNavigation();
bool IsFinished() const
{
// 是否处理完毕
return this -> isFinished;
}
void Process(); // 实际处理
friendistream & operator >> (istream & in ,WebNavigation & webNavi);
};

WebNavigation::WebNavigation()
{
this -> curURL = " http://www.acm.org/ " ; // 默认首页
this -> isFinished = false ;
}
WebNavigation::
~ WebNavigation()
{
// 确保退出时清空使用的栈
ClearStack( this -> forwardStack);
ClearStack(
this -> backwardStack);
}
void WebNavigation::Back()
{
// 退后
if ( ! backwardStack.empty())
{
// 退后栈中有历史记录
forwardStack.push(curURL); // 当前页面进入前进栈
// 从退出栈中栈顶取出页面为当前页面
curURL = backwardStack.top();
cout
<< curURL << endl;
backwardStack.pop();
}
else
{
cout
<< " Ignored " << endl;
}
}
void WebNavigation::ClearStack(stack < string >& s)
{
// 清空栈
while ( ! s.empty())
{
s.pop();
}
}
void WebNavigation::Forward()
{
// 向前
if ( ! forwardStack.empty())
{
// 前进栈中有历史记录
backwardStack.push(curURL); // 当前页面进入后退栈
// 从前进栈中栈顶取出页面为当前页面
curURL = forwardStack.top();
cout
<< curURL << endl;
forwardStack.pop();
}
else
{
cout
<< " Ignored " << endl;
}
}
void WebNavigation::Visit()
{
// 访问新URL
backwardStack.push(curURL); // 当前页面进入后退栈
cin >> curURL;
cout
<< curURL << endl;
ClearStack(forwardStack);
// 清空前进栈
}
void WebNavigation::Process()
{
if (command[ 0 ] == ' Q ' )
{
// 退出
this -> isFinished = true ;
}
else if (command[ 0 ] == ' B ' )
{
// 退后
this -> Back();
}
else if (command[ 0 ] == ' V ' )
{
// 访问新URL
this -> Visit();
}
else if (command[ 0 ] == ' F ' )
{
// 前进
this -> Forward();
}
}
istream
& operator >> (istream & in ,WebNavigation & webNavi)
{
// 输入当前命令
in >> webNavi.command;
return in ;
}

int main( void )
{
int n,cases,i;
cin
>> n;
for (cases = 1 ;cases <= n; ++ cases)
{
WebNavigationwebNavior;
if (cases != 1 )
{
cout
<< endl;
}
while (cin >> webNavior)
{
// 读入一行命令
webNavior.Process();
if (webNavior.IsFinished())
{
// 已经处理完毕
break ;
}
}
}
return 0 ;
}


你可能感兴趣的:(ZOJ1061 Web Navigation)