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
如果我分析的有点问题或者哪里没有考虑到,欢迎大家指出来。
最后附加:
我的微信:
打赏博主 非常感谢: