C++编程例题:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。


题目分析

三种实现思路:

  • 一直以stack2为队列,栈顶为队头,栈底为队尾。这种情况下,pop操作可以直接把stack2的栈顶元素返回就行,但是push操作就需要stack1的辅助了,即先把stack2的元素转移到stack1,这时候stack2的栈顶(队头)就是stack1的栈底,stack2的栈底(队尾)就是stack1的栈顶。push的元素加到stack1的栈顶,然后再把stack1的所有元素转移到stack2。这种实现方式就比较适合pop频率大于push频率的情况
  • 一直以stack1为队列,栈顶为队尾,栈底为队头。这种情况下,push操作可以直接把元素加到stack1的栈顶,但是pop操作就需要stack2的辅助了,即先把stack1的元素转移到stack2,这时候stack1的栈顶(队尾)就是stack1的栈底,stack1的栈底(队头)就是stack1的栈顶。pop的stack2的栈顶,然后再把stack2的所有元素转移到stack1。这种实现方式就比较适合push频率大于pop频率的情况
  • 前面两者的折衷。stack1的栈底是队头,栈顶是队尾。stack2的栈底是队尾,栈顶是队头。但是在执行完一次pop或者push操作后,并不是固定地将元素转移到固定的stack,也就是说,不会一直以某个stack为队列。而是等待下一个指令,如果和前面的是一样的,比如上次是push这次也是push,那就直接进行操作,不用转移。这种实现方式适合连续push或者连续pop的情况

代码实现

第一种

class Solution
{
public:
    void push(int node) {
        while(!stack2.empty()){
            stack1.push(stack2.top());
            stack2.pop();
        }
        stack1.push(node);
        while(!stack1.empty()){
            stack2.push(stack1.top());
            stack1.pop();
        }
    }

    int pop() {
        int the_top=stack2.top();
        stack2.pop();
        return the_top;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

第二种

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
        while(!stack1.empty()){
            stack2.push(stack1.top());
            stack1.pop();
        }
        int the_top=stack2.top();
        stack2.pop();
        while(!stack2.empty()){
            stack1.push(stack2.top());
            stack2.pop();
        }
        return the_top;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

第三种

class Solution
{
public:
    void push(int node) {
        while(!stack2.empty()){
            stack1.push(stack2.top());
            stack2.pop();
        }
        stack1.push(node);
    }

    int pop() {
        while(!stack1.empty()){
            stack2.push(stack1.top());
            stack1.pop();
        }
        int the_top=stack2.top();
        stack2.pop();
        return the_top;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

效率展示

第一种

在这里插入图片描述

第二种

在这里插入图片描述

第三种

在这里插入图片描述

发布了33 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Clover_pofu/article/details/105508728