题目链接: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;
}
};