POJ-1028-Web Navigation解题心得

这道题是目前为止本人做到的最难的题。这道题只要是练习下stack的使用,另外,对于C++中STL的使用也有一定的涉及。(当然,这些数据结构是可以自己实现的,不过为了节省时间,我直接使用了。)

题意是很容易理解的,就是编程模拟实现浏览器的“前进”,“后退”功能。且题目中已说明了如何使用stack 进行编程,应该不算难的。

解决这道题主要遇到的问题:

1)对于当前URL的初始化,“后退stack“的初始化开始时不是很明确,导致花费了不少时间。

2)本人是在Linux用C++实现的,开始时认为input是一条命令一行,导致自己使用了getline函数,提交时出现了“Wrong Answer",自己也莫明其妙。(因为,自己用题目中给出的测试用例测试时完全与题目中给出的输出结果一致。)后来参考下别人的程序,才知道input理解为只以空格隔开即可。

3)还不太熟悉POJ所用的编译器,现在知道如果用C++编程,选择G++编译器即可。

下面是源代码:


#include <iostream> #include <string> #include <stack> using namespace std; int main() { stack<string> backStk; stack<string> forStk; string aLine; string quitStr; string url = "http://www.acm.org/"; while(getline(cin, aLine)) { quitStr = aLine.substr(0, 4); if(quitStr.compare("QUIT") == 0) break; if(aLine.find("VISIT") != string::npos) { backStk.push(url); string::size_type httpPos = aLine.find("http://"); url = aLine.substr(httpPos); cout << url << endl; while(forStk.empty() == false) forStk.pop(); } else if(aLine.find("BACK") != string::npos) { if(backStk.empty() == true) { cout << "Ignored" << endl; continue; } forStk.push(url); url = backStk.top(); backStk.pop(); cout << url << endl; } else if(aLine.find("FORWARD") != string::npos) { if(forStk.empty() == true) { cout << "Ignored" << endl; continue; } backStk.push(url); url = forStk.top(); forStk.pop(); cout << url << endl; } } return 0; }

上面的代码假定了输出以行为单位,这个程序在POJ上WA。但实际上已经能够正确解决题目的问题。

下面则是可以通过的代码:

#include <iostream> #include <string> #include <stack> using namespace std; int main() { stack<string> backStk; stack<string> forStk; string operation; string url = "http://www.acm.org/"; while(cin >> operation) { if(operation.compare("QUIT") == 0) break; if(operation.compare("VISIT") == 0) { backStk.push(url); cin >> url; cout << url << endl; while(forStk.empty() == false) forStk.pop(); } else if(operation.compare("BACK") == 0) { if(backStk.empty() == true) { cout << "Ignored" << endl; continue; } forStk.push(url); url = backStk.top(); backStk.pop(); cout << url << endl; } else if(operation.compare("FORWARD") == 0) { if(forStk.empty() == true) { cout << "Ignored" << endl; continue; } backStk.push(url); url = forStk.top(); forStk.pop(); cout << url << endl; } } return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值