zoukankan      html  css  js  c++  java
  • C++模板应用 -----queue

    本篇我们将实现Queue的简单操作;

    一、Queue版本1;

    通过本程序,我们可以看到 pop、push 、back、front、size的简单操作的实现;

    //Queue.hpp
    #ifndef QUEUE_H_
    #define QUEUE_H_
    
    #include <deque>
    
    template <typename T, typename V =std::deque<T>//默认的类型形参 >
    class Queue
    {
        public:
            typedef typename V::size_type size_type;
            
            Queue(){ } 
            void push(const T &t)
            { elems_.push_back(t);  }//调用deque的函数
            void pop()
            { elems_.pop_front(); }
            
            const T &back()const
            { return elems_.back();}
            T &back()
            
            { return elems_.back();}
            const T &front()const
            { return elems_.front();}
            T &front()
            { return elems_.front();}
            
            size_type size()const
            { return elems_.size(); }
            
            bool empty()const
            { return elems_.empty(); }
        private:
            V elems_; ///唯一的数据成员
            //我们将类型为T的元素存储于 elemss_(deque)中,调用deque的接口,实现以上各个功能
    };
    
    #endif 

    main.cpp

     1 #include "Queue.hpp"
     2 #include <iostream>
     3 #include <string>
     4 using namespace std;
     5 
     6 int main(int argc, const char *argv[])
     7 {
     8     Queue<string> qu;
     9     qu.push("hello");
    10     qu.push("world");
    11 
    12     cout <<qu.size() << endl;
    13 
    14     cout << qu.back()<< endl;
    15     
    16     while( !qu.empty())
    17     {
    18         cout << qu.front()<< endl;
    19         qu.pop();
    20     }
    21    
    22     return 0;
    23 }


    二、Queue版本2:

    上面的程序尽管完成了一些操作,但是若要遇到一些问题,便束手无策了,例如:

    现有类型 Queue<int,deque<int> > q1;

    1、将 Queue<double, deque<double>> q2 类型的队列 复制或者赋值给 q1;(仅仅 将 int 换为double , deque没有发生变化)

    2、又或者 将Queue<double, list<double> >  q3复制或者赋值给 q1;(将 int 换位 double, 将deque默认类型形参 换为  list)

    以下程序帮我们实现此类转换:

    Stack.hpp

     1 #ifndef QUEUE_H_
     2 #define QUEUE_H_
     3 
     4 #include <deque>
     5 
     6 template <typename T, typename V =std::deque<T> >
     7 class Queue
     8 {
     9     public:
    10         typedef typename V::size_type size_type;
    11         Queue(){}
    12         //完成两种不同类型的转换,需要重置两个形参
    13         //如Queue<int>-->Queue<double> || -->Queue<double, list<double> >
    14         template <typename T2, typename V2>
    15         Queue<T, V>(const Queue<T2, V2> &other);
    16         template <typename T2, typename V2>
    17         Queue<T, V> &operator=(const Queue<T2, V2> &other);
    18 
    19         void push(const T &t)
    20         { elems_.push_back(t);  }
    21         void pop()
    22         { elems_.pop_front(); }
    23         
    24         const T &back()const
    25         { return elems_.back();}
    26         T &back()
    27         { return elems_.back();}
    28         const T &front()const
    29         { return elems_.front();}
    30         T &front()
    31         { return elems_.front();}
    32         
    33         size_type size()const
    34         { return elems_.size(); }
    35         
    36         bool empty()const
    37         { return elems_.empty(); }
    38     private:
    39         V elems_;
    40 };
    41 
    42 template <typename T, typename V>  //注意要用两个模板声明
    43 template <typename T2, typename V2>
    44 Queue<T, V>::Queue(const Queue<T2, V2> &other) //copy构造函数
    45 {
    46     Queue<T2, V2> tmp(other); //将 other 拷贝
    47     while( !tmp.empty())
    48     {
    49         push(tmp.front()); //赋值给当前queue<T,V>
    50         tmp.pop();
    51     }
    52 }
    53 
    54 template <typename T, typename V>
    55 template <typename T2, typename V2>
    56 Queue<T, V> &Queue<T,V>::operator=(const Queue<T2, V2> &other)
    57 {
    58     //判断两者是否相等
    59     if((void*)this == (void*)&other)
    60         return *this;
    61     //删除元素
    62     while( !empty() )
    63         pop();
    64     //复制元素   
    65     Queue<T2, V2> tmp(other);
    66     while( !tmp.empty())
    67     {
    68         push(tmp.front());
    69         tmp.pop();
    70     }
    71 }
    72 
    73 #endif 


    main.cpp

     1 #include "Queue.hpp"
     2 #include <iostream>
     3 #include <list>
     4 using namespace std;
     5 
     6 int main(int argc, const char *argv[])
     7 {
     8     Queue<int> qt;
     9     qt.push(62);
    10     qt.push(23);
    11     qt.push(9);
    12     qt.push(56);
    13     qt.push(31);
    14     
    15     cout << qt.size() << endl;
    16 
    17     Queue<double> qt2(qt);
    18     cout << "qt2" << endl;
    19     while(!qt2.empty())
    20     {
    21         cout <<qt2.front() << endl;
    22         qt2.pop();
    23     }
    24     
    25     Queue<double, list<double> > qt3;
    26     qt3 = qt;
    27     cout << "qt3" << endl;
    28     while(!qt3.empty())
    29     {
    30         cout <<qt3.front() << endl;
    31         qt3.pop();
    32     }
    33    
    34     return 0;
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/xfxu/p/4003768.html
Copyright © 2011-2022 走看看