题目链接:1472. 设计浏览器历史记录
算法:双栈
数据结构:栈
思路:这明明是一道栈的题目,不知道为啥LeetCode给标成了链表的题目。
可以利用两个栈来实现,一个栈backend用来存储访问历史,另外一个也用来存储访问历史,
咳咳,开个玩笑,另外一个栈frontend用来存储前进历史。
什么是前进历史呢,就是当我们执行一次back操作时,将backend栈的栈顶元素弹出,然后塞入frontend栈,这样再执行forward操作时才能找到之前弹出的历史。
visit:将当前页面链接塞入backend栈,然后跳转到新的链接,注意跳转后要将frontend栈内元素清空;back:弹出steps次backend栈顶元素,如果栈为空则停止,弹出的元素主义塞入frontend栈;forward:弹出steps次frontend栈顶元素,如果栈为空则停止,弹出的元素主义塞入backend栈;
class BrowserHistory {
private:
stack<string> backend;
stack<string> frontend;
string curUrl;
public:
BrowserHistory(string homepage) {
this->curUrl = homepage;
}
void visit(string url) {
this->backend.push(this->curUrl);
this->curUrl = url;
while (!this->frontend.empty()) this->frontend.pop();
}
string back(int steps) {
while (steps-- && !this->backend.empty()) {
this->frontend.push(this->curUrl);
this->curUrl = this->backend.top();
this->backend.pop();
}
return this->curUrl;
}
string forward(int steps) {
while (steps-- && !this->frontend.empty()) {
this->backend.push(this->curUrl);
this->curUrl = this->frontend.top();
this->frontend.pop();
}
return this->curUrl;
}
};