剑指offer之两个队列实现栈的问题

简介: 剑指offer之两个队列实现栈的问题

1 问题

两个队列实现栈的插入和获取头部元素的功能

2 分析

1)获取头部元素的功能分析:

我们有2个队列,我们知道队列的特点的先进先出,而栈的特点是先进后出,比如我们有数据1,2,3,4,我们分别依次压入队列1,队列2目前是空,我们需要有栈的效果,加上队列2也是先进先出的特点,意味着我们队列2里面的数据依次是4,3,2,1入队列2,现在问题转成了我们怎么操作队列1里面的数据让它依次弹出4,3,2,1入队列2

接下来我们分析怎么操作队列1里面的数据让它依次弹出4,3,2,1入队列2

我们知道队列1数据进去的时候是1,2,3,4.我们需要得到4,我们可front()得到进入队列的第一个元素,然后push到队列1,然后执行pop()函数,那么队列1就变成了2,3,4,1, 同理我们也这样操作,知道元素4在队列的最头部,队列1也就变成了3,2,1,4,我们把4弹出来压入到队列2里面去,然后队列1的数据是3,2,1,我们依然按照上面的方法,把3弹出来压入队列2,最后队列2就入队列的元素依次是4,3,2,1 再把队列2弹出头部元素,就是我们栈获取头部元素的效果。

2)插入元素的功能分析:

如果队列2不为空的情况下,我们需要先把队列2里面的元素一一弹出来放到(push)队列1里面去,确保队列2是空的之后,然后再把新的元素push到队列的1的尾巴

如果队列2为空的情况下,我们可以直接把新的元素push到队列1里面去就行。


3 代码实现

#include <iostream>
#include <queue>
using namespace std;
class student
{
public:
    student(){}
    ~student(){}
    student(std::string name, std::string age, std::string sex) 
    {
        this->name = name;
        this->age = age;
        this->sex = sex;
    }
    void toString()
    {
        std::cout << "name is "<< name << " age is "<< age << " sex is "<< sex << std::endl;
    }
private:
    std::string name;
    std::string age;
    std::string sex;
};
template <typename T> 
class Test
{
public:
    Test(){}
    ~Test(){}
    Test(const T& t);
    //往队列里面添加元素
    void add(const T& t);
    //往队列里面删除元素
    T top();
private:
    std::queue<T> queue1;
    std::queue<T> queue2;
};
template <typename T> void Test<T>::add(const T& t)
{
    if (!queue2.empty())
    {
         T& top = queue2.front();
         queue1.push(top);
         queue2.pop();
    }
    queue1.push(t);
}
template <typename T> T Test<T>::top()
{
    if (queue2.empty())
    {
        while (!queue1.empty())
        {
            int size = queue1.size();
            for (int i = 1; i < size; ++i)
            {
                T& top = queue1.front();
                queue1.push(top);
                queue1.pop();
            }
            T& value = queue1.front();
            queue2.push(value);
            queue1.pop();
        }
    }
    T top = queue2.front();
    queue2.pop();
    return top;
}
int main() {
    student std1("chenyu", "27", "man");
    student std2("chencaifeng", "27", "woman");
    student std3("chenzixuan", "3", "woman");
    student std4("chenzixi", "2", "woman");
    student std5("chenxuan", "21", "man");
    Test<student> stack;
    stack.add(std1);
    stack.add(std2);
    stack.add(std3);
    stack.add(std4);
    student top1 = stack.top();
    top1.toString();
    student top2 = stack.top();
    top2.toString(); 
    student top3 = stack.top();
    top3.toString(); 
    std::cout << "--------------------" << std::endl; 
    stack.add(std5);
    student top4 = stack.top();
    top4.toString(); 
    student top5 = stack.top();
    top5.toString();  
  return 0;
}

4 运行结果

name is chenzixi age is 2 sex is woman
name is chenzixuan age is 3 sex is woman
name is chencaifeng age is 27 sex is woman
--------------------
name is chenxuan age is 21 sex is man
name is chenyu age is 27 sex is man

相关文章
|
1月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
12 0
Leetcode225.用队列实现栈
Leetcode225.用队列实现栈
35 0
|
6月前
|
存储
leetcode:225. 用队列实现栈
leetcode:225. 用队列实现栈
30 0
|
6月前
|
Java C++ Python
leetcode-225:用队列实现栈
leetcode-225:用队列实现栈
49 0
|
6月前
|
测试技术 C语言 C++
LeetCode | 225.用队列实现栈(C++版)
LeetCode | 225.用队列实现栈(C++版)
39 0
|
6月前
leetcode:用队列实现栈(后进先出)
leetcode:用队列实现栈(后进先出)
剑指offer-8.用两个栈实现队列
剑指offer-8.用两个栈实现队列
23 1
【Leetcode -225.用队列实现栈 -232.用栈实现队列】
【Leetcode -225.用队列实现栈 -232.用栈实现队列】
52 0
|
存储
每日一题——用两个栈实现队列
每日一题——用两个栈实现队列
每日一题——用两个队列实现栈
每日一题——用两个队列实现栈