代码随想录算法训练营第十天| 理论基础、232.用栈实现队列、225. 用队列实现栈

理论基础

  1. STL(C++标准库),栈和队列是STL里面的两个数据结构
  2. 栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。

    所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。

  3. 栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。

232.用栈实现队列

栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili 笔记:

需要用栈去复现队列的三个基本操作:push(), pop(), peek(), empty() 将一个元素放入队列的尾部从队列首部移除元素返回队列首部的元素,判断队列是否为空

push()两个数据结构的操作是一样的

pop()的话需要创建两个stack,stackin,stackout,需要先判断stackout是否为空才能开始操作,只要stackin里面有数据,那么把stackin的值先弹出到stackout里面,,这样可以从1-> 2 -> 到  3->2->1 到 1<-2<-3,最后再result = stackout.top()

peek()可以重复pop的操作,之后再把取出来的数据push回去

如果stackin和stackout都是空的话,那么这个队列是空的

自己写代码的时候遇到的问题以及debug记录:

1. 在哪里定义两个栈:是属于class的全局变量,不能只在某一个方法中定义

        正常写的时候需要这三句:

        #include<iostream>

        using namespace std;

        #include<stack>

2.use of undeclared identifier 'result' result = stackOut.top(); -> 忘记定义result的数据类型,int

最后成功的代码:

class MyQueue {
public:

    stack<int> stackIn;
    stack<int> stackOut;

    //构造函数,暂时用不上
    MyQueue() {

    }
    
    void push(int x) {
        stackIn.push(x);
    }
    
    int pop() {
        if(stackOut.empty()){
            while(!stackIn.empty()){
                stackOut.push(stackIn.top());//出栈获得了入栈最后进去的数据
                stackIn.pop();//入栈释放内存
            }
        }
        int result = stackOut.top(); //获取队列首部的值
        stackOut.pop(); //移除队列首部的值
        return result;
    }
    
    int peek() {
        int result = this->pop(); //直接调用移除第一位数据的方法,注意这里的调用写法
        stackOut.push(result); //因为只是取值,所以要把移除的数据再放回去
        return result;
    }
    
    bool empty() {
        return stackIn.empty()&& stackOut.empty();
    }
};

225. 用队列实现栈

假如我们放了 1 2 3 三个元素,对于栈来说,它弹出数据的顺序是3 2 1,但是队列弹出数据的顺序还是 1 2 3,所以我们可以先弹出队列中size-1个元素,再把他们push进队列,之后再弹出第一个元素,每一次都这么循环往复直到队列是empty

自己写代码出现的问题:

while(size)这个括号里面没有写size--,我和上面的size--搞混淆了,while(size--)里面的size--其实是放在循环的最后,也就是每次做完移动的操作,size--,这样才能从下一个开始移动,在更改完这个bug之后,就通过测试了

class MyStack {
public:
    //创建队列
    queue <int> q;

    MyStack() {

    }
    
    void push(int x) {
        q.push(x);
    }
    
    int pop() {
        int size = q.size();
        size--;
        while(size){
            //先把队列的第一个元素放进q
            q.push(q.front());
            //再移除队列的第一个元素
            q.pop();
        }
        int result = q.front();
        q.pop();
        return result;
    }
    
    //模拟栈第一个弹出的元素:也就是队列里最后一个元素
    int top() {
        return q.back();
    }
    
    bool empty() {
        return q.empty();
    }
};

正确代码

class MyStack {
public:
    //创建队列
    queue <int> q;

    MyStack() {

    }
    
    void push(int x) {
        q.push(x);
    }
    
    int pop() {
        int size = q.size();
        size--;
        while(size--){
            //先把队列的第一个元素放进q
            q.push(q.front());
            //再移除队列的第一个元素
            q.pop();
        }
        int result = q.front();
        q.pop();
        return result;
    }
    
    //模拟栈第一个弹出的元素:也就是队列里最后一个元素
    int top() {
        return q.back();
    }
    
    bool empty() {
        return q.empty();
    }
};

总结

只是在学java的时候学到过栈的概念,队列和栈在c++的表达方式甚至是第一次接触到的,学到了很多东西,但是这次的东西比以前的少一点,而且我的熟练度上去了,所以这次需要的时间变少了,只有1h30min

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值