代码随想录算法训练营15期 Day 10 | 理论基础、232.用栈实现队列、225. 用队列实现栈

理论基础

队列是先进先出,栈是先进后出。

四个问题:

  1. C++中stack 是容器么?
  2. 我们使用的stack是属于哪个版本的STL?
  3. 我们使用的STL中stack是如何实现的?
  4. stack 提供迭代器来遍历stack空间么?

栈和队列是STL(C++标准库)里面的两个数据结构。

栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。

栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)

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

232.用栈实现队列

队列是先进先出,栈是先进后出。

之前本科学过,早就忘记了。这里需要注意三个概念,分别是push、pop、top,搞清楚这三个概念就是可以进行后续的操作的。代码如下所示:

class MyQueue {
public:
    //首先声明两个栈,一个入栈一个出栈
    stack<int> in;
    stack<int> out;

    MyQueue() {

    }
    
    void push(int x) {
        //入栈过程
        in.push(x);

    }
    
    int pop() {
        //首先判断出栈是否为空
        while(out.empty())
        {
            //判断入栈是否为空,在不为空的情况下
            while(!in.empty())
            {
                out.push(in.top());
                in.pop();
            }
        }
        int result = out.top();
        out.pop();
        return result;

    }
    
    int peek() {
        int result1 = this->pop();
        out.push(result1);
        return result1;

    }
    
    bool empty() {
        return in.empty()&&out.empty();

    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

225. 用队列实现栈

思路弹出元素的过程就是将前面的size()-1弹出去,然后再加入后面就是可以的。

这个代码比较简单,一次运行成功。

class MyStack {
public:

    //首先声明队列
    queue<int> que;

    MyStack() {

    }
    
    void push(int x) {
        que.push(x);

    }
    
    int pop() {
        int queSize = que.size();

        queSize = queSize - 1;//首先将数目减一操作

        while(queSize--)
        {
            que.push(que.front());
            que.pop();
        }

        int result = que.front();

        que.pop();

        return result;
    }
    
    int top() {

        return que.back();

    }
    
    bool empty() {
        return que.empty();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

猜你喜欢

转载自blog.csdn.net/m0_47489229/article/details/131002490