代码随想录第38期Day10

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

今天是跟着代码随想录刷题的第10天,今天主要学了以下内容:栈和列表的理论知识、用队列实现栈以及用栈实现队列。
链接地址:栈与队列的内部实现机制用栈实现队列用队列实现栈


一、栈和队列的理论知识

栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
在这里插入图片描述
我们也可以指定vector为栈的底层实现,初始化语句如下:

std::stack<int, std::vector<int> > third;  // 使用vector为底层容器的栈

也可以指定list 为起底层实现,初始化queue的语句如下:

std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列

总结:栈先进后出,队列先进先出

二、用栈实现队列

使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
思路:
push这个就直接放到栈里面就是尾部了
pop这个用到两个栈,第一个栈负责存放一开始放进来的东西,然后第二个栈,负责把第一个栈从最外面一个一个往第二个栈送,这样第二个栈最外面就是第一个栈最里面的元素,也是队列最先放进去的元素,此时直接移除第一个元素就是队列的首部元素
peek这个就是用到上面那个,先取出首部元素,移除以后再放回去就行了
empty就是检测两个栈是不是都没元素,如果都没元素就空了
代码:

class MyQueue {
public:
    stack<int> stIn;
    stack<int> stOut;
    MyQueue() {

    }
    
    void push(int x) {
    stIn.push(x);
    }
    
    int pop() {
    if(stOut.empty())
    {
        while(!stIn.empty())
        {
            stOut.push(stIn.top());
            stIn.pop();
        }
    }
    int result=stOut.top();
    stOut.pop();
    return result;
    }
    
    int peek() {
    int res = this->pop();
    stOut.push(res);
    return res;


    }
    
    bool empty() {
    return stIn.empty()&&stOut.empty();

    }
};

记住栈的操作
stIn.top()栈的最上面的一个元素
stIn.pop()把栈的最上面的元素移除出来
stIn.push(x)把x放进去栈里面

三、用队列实现栈

思路:计算队列的长度,然后需要输出的队列最后一个前面一个一个弹出去,再加入,这样输出front就是栈顶元素,记得在弹出最后一个元素之前,得把他保留下来,不然就返回不了这个元素了。

class MyStack {
public:
    queue<int> que;
    MyStack() {
    
    }
    
    void push(int x) {
    que.push(x);
    }
    
    int pop() {
    int n=que.size()-1;
    while(n--)
    {
       que.push(que.front());
       que.pop();
    }
    int c=que.front();
    que.pop();
    return c;

    
    }
    
    int top() {   
    return que.back();
    }
    
    bool empty() {
    return que.empty();
    }
};

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值