一、题目
模拟浏览器操作程序:标准的Web浏览器具有在最近访问的页面中前后移动的特性。实现这些特性的一种方法是使用两个堆栈来跟踪可以通过前后移动到达的页面。在这个问题中,我们要求实现这一点。
需要支持以下命令:
- BACK:将当前页面压入前向堆栈的顶部;从后向堆栈的顶部弹出该页,使其成为新的当前页。如果后向堆栈为空,则该指令忽略。
- FORWARD:将当前页面压入后向堆栈的顶部;从前向堆栈的顶部弹出该页,使其成为新的当前页。如果前向堆栈为空,则该指令忽略。
- VISIT:将当前页面压入后向堆栈的顶部,将URL指定为新的当前页。前向堆栈被清空。
- QUIT:退出浏览器。
假设浏览器最初在网址http://www.game.org/上加载网页。
二、系统设计
2.1 功能模块图
2.2 主要功能函数
函数名 | 功能 |
---|---|
void visit() | 将当前页推到“后退栈”的顶部。使URL特指当前页。清空“前进栈”。 |
void forward() | 将当前页推进到“后退栈”的顶部。取出“前进栈”中顶端的页面,使它成为当前页。若“前进栈”为空,则忽略。 |
void backk() | 将当前页推进到“前进栈”的顶部。取出“后退栈”中顶端的页面,使它成为当前页。若“后退栈”为空,则忽略。 |
三、问题分析
按照问题描述
- 首先,设置两个堆栈分别为前进栈(forw)和后退栈(back)。将当前页面压入后退栈顶。
- 接着,编写题目要求的四个指令功能函数及主函数。
- VISIT
<url>
:输入页面后,将该页面压入后退栈的顶部。当前进栈非空时,将前进栈的元素出栈,,直至前进栈为空。最后,输出当前页面。 - BACK:当后退栈中只有当前页面时,忽略该命令,输出“Igonred”。否则,后退至上一个页面,即将当前页面压入前进栈,将当前后退栈中的栈顶元素(即当前页面)弹出,然后输出后退栈顶元素(为上一个页面)即可。
- FORWARD:当前进栈中只有当前页面时,忽略该命令,输出“Igonred”。否则,前进至下一个页面,即将当前页面压入后退栈,将当前进栈中的栈顶元素(即当前页面)弹出,然后输出前进栈顶元素(为下一个页面)即可。
- QUIT:当输入QUIT指令时,结束循环即可。
- 主函数:声明变量ord,用于输入指令。循环判断输入的指令,根据指令执行不同的功能函数,当输入QUIT指令时结束循环。
四、实验结果及分析
模拟浏览器操作程序:根据书中测试输入,输入测试样例如图。得出输出结果。与书中测试结果一致。由此判断完成题目需求。
五、源码
main.cpp
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
stack<string> forw; //前向堆栈
stack<string> back; //后向堆栈
back.push("http://www.game.org/"); //back的顶部为当前页面
string ord; //命令
string url; //网址
while (1)
{
cin >> ord;
if (ord == "VISIT")
{
cin >> url;
back.push(url); //将输入页面压入后向堆栈的顶部
while (!forw.empty()) //前向堆栈被清空
{
forw.pop();
}
cout << back.top() << endl; //输出当前页面
}
else if (ord == "BACK")
{
if (back.size() <= 1) //后向堆栈中只有当前页面
{
cout << "Ignored" << endl;
}
else
{
forw.push(back.top()); //当前页面压入前向堆栈顶部
back.pop(); //从后向堆栈弹出
cout << back.top() << endl; //输出当前页面
}
}
else if (ord == "FORWARD")
{
if (forw.empty()) //前向堆栈为空
{
cout << "Ignored" << endl;
}
else
{
back.push(forw.top()); //当前页面压入后向堆栈顶部
forw.pop(); //从前向堆栈弹出
cout << back.top() << endl; //输出当前页面
}
}
else //QUIT,退出,结束循环
{
break;
}
}
return 0;
}
总结
此为本人2022年大二下学期数据结构课设中的一道题目。特此记录。