栈与队列的相互实现

文章目录

  • 问题:用栈实现队列
    • 解题思路
    • C++代码
  • 问题:用队列实现栈
    • 解题思路
    • C++实现

问题:用栈实现队列

题目链接
栈与队列的相互实现_第1张图片

解题思路

队列是先进先出的,而栈是先进后出的,单用一个栈是不能完成任务,我们增加一个栈,分别设为s1和s2

  • 入队操作:直接将元素入栈到s1,
  • 出队操作:若s2不为空,直接出栈,若s2为空,则先将s1中的元素全部出栈并压入s2中,然后对s2进行出栈操作,这样就能实现先进先出。

C++代码

class MyQueue {
public:
    /** Initialize your data structure here. */
    MyQueue() {

    }
    
    /** Push element x to the back of queue. */
    void push(int x) {//直接在s1上实行入栈操作
        s1.push(x);
    }
    
    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        if(empty()) return 0;
        move_s1_to_s2();
        int val = s2.top();
        s2.pop();
        return val;
    }
    
    /** Get the front element. */
    int peek() {
        if(empty()) return 0;
        move_s1_to_s2();
        return s2.top();
    }
    
    /** Returns whether the queue is empty. */
    bool empty() {//s1和s2都为空时队列才为空
        return s1.empty() && s2.empty();
    }
private:
    void move_s1_to_s2(){//如果s2为空,将s1中的元素全部出栈并压入s2中
        if(!s2.empty()) return;
        while(!s1.empty()){
            s2.push(s1.top());
            s1.pop();
        }
    }
    stack<int>s1;
    stack<int>s2;
};

/**
 * 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();
 */

问题:用队列实现栈

问题链接
栈与队列的相互实现_第2张图片

解题思路

同问题用栈实现队列相似,在本问题中我们通过两个队列实现栈,设两个队列的编号分别为q1和q2,用cur指示当前数据在哪个队列中,如果cur = 1,说明数据在q1中,否则cur = 2,说明数据在q2中,由于队列是先进先出,而栈是先进后出,因此如果要出栈时,必须将队列中的元素迁移到另一个队列中,直到只剩一个元素,讲此元素出队列即可达到出栈的效果

C++实现

class MyStack {
public:
    /** Initialize your data structure here. */
    MyStack() {
        cur = 1;//初始将数据放在q1中
    }
    
    /** Push element x onto stack. */
    void push(int x) {
        if(cur == 1)
            q1.push(x);//如果cur = 1,则说明数据在q1中,将元素压入q1即可
        else
            q2.push(x);
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        if(empty()) return 0;
        if(cur == 1){//如果cur = 1,则数据在q1中,先将q1中的数据移动到q2中,直到q1中只剩一个元素,此元素就是要出栈的元素
            while(q1.size() > 1){
                q2.push(q1.front());
                q1.pop();
            }
            int front = q1.front();
            q1.pop();
            cur = 2;//经过此操作后,数据都在q2中,因此用cur记录
            return front;
        }

        while(q2.size() > 1){
            q1.push(q2.front());
            q2.pop();
        }
        int front = q2.front();
        q2.pop();
        cur = 1;
        return front;
    }
    
    /** Get the top element. */
    int top() {//获得栈顶元素,使用pop操作和push操作的组合,先pop出模拟栈的栈顶元素,然后在压入这个元素
        int front = pop();
        push(front);
        return front;
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return q1.empty() && q2.empty();
    }
private:
    queue<int>q1;
    queue<int>q2;
    int cur;//指示当前操作的队列
};

/**
 * 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();
 */

你可能感兴趣的:(数据结构)