C/C++面试题—使用STL两个队列实现一个栈

题目介绍

使用STL中的两个队列实现一个栈,实现栈的top、pop、push、clear等操作。

思路分析

思路和使用2个栈实现一个队列是相通的,用一个队列queue1容器用来 压栈,出栈的时候判断queue1.size()是否大于1,大于1的话队尾元素是栈顶需要弹出,这时就用到了queue2,将queue1其他的元素倒腾到queue2中,queue1中剩下的那一个元素就是栈顶的元素了。下次再继续出栈,如果queue1中没有元素 就判断queue2中的元素,queue2的队尾为栈顶,将其他元素倒腾到queue1中。

代码展示

/*

使用STL,用两个队列来实现一个栈,完成栈的push,pop,top,clear
*/
#include <queue>
#include <stack>
#include <iostream>
using namespace std;

template<typename T> class MyStack
{
public:
    void clear()
    {
        if (queue1.size() > 0)
            queue1.swap(queue<T>());
        if (queue2.size() > 0)
            queue2.swap(queue<T>());

    }
    T top() //栈顶就是 队列的最后一个元素,和pop函数十分类似
    {
        while (queue1.size() > 1)//queue1的队尾元素是栈顶元素,将其余的倒腾到queue2中去
        {
            T front = queue1.front();
            queue1.pop();
            queue2.push(front);
        }
        if (queue1.size() == 1)
        {
            T front = queue1.front();
            //queue1.pop();
            return front;
        }
        while (queue2.size() > 1)//queue1没有元素,queue2有元素,queue2的队尾为栈顶元素,将其余的倒腾到queue1中去
        {
            T front = queue2.front();
            queue2.pop();
            queue1.push(front);
        }
        if (queue2.size() == 1)
        {
            T front = queue2.front();
            //queue2.pop();
            return front;
        }
        throw std::exception("queue is empty");
    }
    void push(T data)   //压栈
    {
        queue1.push(data);
    }
    T pop() //将栈顶元素弹出
    {
            while (queue1.size() > 1)//queue1的队尾元素是栈顶元素,将其余的倒腾到queue2中去
            {
                T front = queue1.front();
                queue1.pop();
                queue2.push(front);
            }
            if (queue1.size() == 1)
            {
                T front = queue1.front();
                queue1.pop();
                return front;
            }
            while (queue2.size() > 1)//queue1没有元素,queue2有元素,queue2的队尾为栈顶元素,将其余的倒腾到queue1中去
            {
                T front = queue2.front();
                queue2.pop();
                queue1.push(front);
            }
            if (queue2.size() == 1)
            {
                T front = queue2.front();
                queue2.pop();
                return front;
            }
            throw std::exception("queue is empty");
    }
private:
    queue<T> queue1;    //用来压栈
    queue<T> queue2;    //辅助容器
};

int main(int argc, char *argv[])
{
    MyStack<int> stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);
    int top = stack.top();//3
    cout << "top = " << top << endl;    //3
    int n1 = stack.pop();
    int n2 = stack.pop();
    top = stack.top();
    cout << "top = " << top << endl;    //1
    int n3 = stack.pop();
    cout << n1 << " "<< n2 << " " << n3 << endl;        //入栈 1 2 3 ->出栈 3 2 1
    stack.clear();
    stack.push(100);
    stack.push(200);
    stack.push(300);
    n1 = stack.pop();
    n2 = stack.pop();
    n3 = stack.pop();
    cout << n1 << " " << n2 << " " << n3 << endl;       //入栈 100 200 300 ->出栈 300 200 100
    return 0;
}

运行测试

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29542611/article/details/80418786