队列的定义

【数据结构笔记】队列

现实生活中的排队

队列的性质

【数据结构笔记】队列

【数据结构笔记】队列

队列的顺序存储实现

【数据结构笔记】队列

代码复用:

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

队列的链式存储实现

【数据结构笔记】队列

代码复用:

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

小结

【数据结构笔记】队列


队列的优化实现

顺序队列的瓶颈

【数据结构笔记】队列

【数据结构笔记】队列

顺序队列的优化方案

【数据结构笔记】队列

队列的顺序优化实现

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列


链式队列的瓶颈

【数据结构笔记】队列

链式队列的优化方案

【数据结构笔记】队列

【数据结构笔记】队列

代码

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列


小结

【数据结构笔记】队列

效率提高,实现复杂度也提高了



队列的特别实现

栈与队列

【数据结构笔记】队列

【数据结构笔记】队列

算法框架

【数据结构笔记】队列

代码

【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列【数据结构笔记】队列

【数据结构笔记】队列

【数据结构笔记】队列


小结

【数据结构笔记】队列


思考:

【数据结构笔记】队列

【数据结构笔记】队列


两个队列实现栈

题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。


template <typename T>class CQueue
{
public:
  CQueue(void);
  ~CQueue(void);
  void appendtail(const T& node);
  T deleteHead();
private:
  stack<T> stack1;
  stack<T> stack2;

};

解题思路:

插入操作在stack1中进行,删除操作在stack2中进行,如果stack2为空,则将stack1中的所有元素转移到stack2中。

代码实例:

解法:

【数据结构笔记】队列
【数据结构笔记】队列
  1. 有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。
  2. 现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。
  3. 如果继续做push操作,比如插入d,f,则把d,f插入到q2中,
  4. 此时若要做pop操作,则做步骤2
  5. 以此类推,就实现了用两个队列来实现一个栈的目的。

注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。

对于push和pop操作,其时间为O(n).

#include<iostream>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;


template <typename T>class CStack
{
public:
    CStack(void){};
    ~CStack(void){};
    void push(const T& node);
    T pop();
private:
    queue<T> queue1;
    queue<T> queue2;
    
};


//插入元素
template <typename T> void CStack<T>::push(const T& element)
{
    if(queue1.size()>0)//如果queue1不为空则往queue1中插入元素
        queue1.push(element);
    else if(queue2.size()>0)//如果queue2不为空则往queue2中插入元素
        queue2.push(element);
    else//如果两个队列都为空,则往queue1中插入元素
        queue1.push(element);
        
}


//删除元素
template <typename T> T CStack<T>::pop()
{
    if(queue1.size()==0)//如果queue1为空
    {
        while(queue2.size()>1)//保证queue2中有一个元素,将其余元素保存到queue1中
        {
            queue1.push(queue2.front());
            queue2.pop();
        }
        T& data=queue2.front();
        queue2.pop();
        return data;
    }
    else//如果queue2为空
    {
        while(queue1.size()>1)//保证queue2中有一个元素,将其余元素保存到queue1中
        {
            queue2.push(queue1.front());
            queue1.pop();
        }
        T& data=queue1.front();
        queue1.pop();
        return data;
    }


}




void main()
{
    CStack<int> stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);


    int len=4;
    while(len>0)
    {
        cout<<stack.pop()<<" ";
        --len;
    }


    system("pause");
}

相关文章:

  • 2022-01-11
  • 2021-08-22
  • 2021-10-31
  • 2021-11-15
  • 2021-11-13
  • 2021-05-28
  • 2021-11-02
  • 2021-06-03
猜你喜欢
  • 2022-01-07
  • 2022-12-23
  • 2021-05-02
  • 2021-12-28
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案