每日一题《leetcode--1472.设计浏览器历史记录》

https://leetcode.cn/problems/design-browser-history/


 这里我是用双栈实现前进和后退。

#define URL_SIZE 21
#define STACK_SIZE 5000


typedef struct {
    char *BackStack[STACK_SIZE];    //回退栈
    char *ForwardStack[STACK_SIZE]; //前进栈
    int BackTop;    //回退栈的栈顶下标
    int ForwardTop;  //前进栈的栈顶下标
} BrowserHistory;

char *CreatUrl(char* url)
{
    char *ChUrl = (char*)malloc(sizeof(char) * URL_SIZE);
    strcpy(ChUrl,url);
    return ChUrl;
}

BrowserHistory* browserHistoryCreate(char* homepage) {
    BrowserHistory* obj = (BrowserHistory*)malloc(sizeof(BrowserHistory));
    memset(obj, 0, sizeof(BrowserHistory));
    obj -> BackTop = -1;
    obj -> ForwardTop = -1;

    char *ChUrl = CreatUrl(homepage);
    obj->BackStack[++(obj->BackTop)] = ChUrl;
    return obj;
}

void browserHistoryVisit(BrowserHistory* obj, char* url) {
    //跳转至url
    char* ChUrl = CreatUrl(url);
    obj->BackStack[++(obj->BackTop)] = ChUrl;

    //跳转完成后需要把前进栈中的数据给清空,里面的url不能被访问
    while(obj->ForwardTop >= 0)
    {
        free(obj->ForwardStack[obj->ForwardTop]);
        obj->ForwardStack[obj->ForwardTop] = NULL;
        obj->ForwardTop--;
    }

}

char* browserHistoryBack(BrowserHistory* obj, int steps) {
    int count = 0;  //记录回退的步数
    while(count < steps && obj->BackTop > 0)
    {
        //把回退栈中栈顶的数据放入前进栈中
        obj->ForwardStack[++(obj->ForwardTop)] = obj->BackStack[obj->BackTop];
        obj->BackStack[obj->BackTop] = NULL;
        obj->BackTop--;
        count++;
    }

    return obj->BackStack[obj->BackTop];
}

char* browserHistoryForward(BrowserHistory* obj, int steps) {
    int count = 0;  //记录前进的步数
    while(count < steps && obj->ForwardTop >= 0)
    {
        obj->BackStack[++(obj->BackTop)] = obj->ForwardStack[obj->ForwardTop];
        obj->ForwardStack[obj->ForwardTop] = NULL;
        obj->ForwardTop--;
        count++;
    }

    return obj->BackStack[obj->BackTop];
}

void browserHistoryFree(BrowserHistory* obj) {
    while(obj->BackTop >= 0)
    {
        free(obj->BackStack[obj->BackTop]);
        obj->BackTop--;
    }

    while(obj->ForwardTop >= 0)
    {
        free(obj->ForwardStack[obj->ForwardTop]);
        obj->ForwardTop--;
    }

    free(obj);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peace & Love487

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值