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;
  • 相关阅读:
    Python time ctime()方法
    Python time clock()方法
    Python time asctime()方法
    Python time altzone()方法
    Python 日期和时间
    java——字符串常量池、字符串函数以及static关键字的使用、数组的一些操作函数、math函数
    java——API
    java——类、对象、private、this关键字
    Java——方法及构造方法、intellij IDEA中的一些快捷键
    IntelliJ IDEA 运行java程序时出现“程序发生找不到或无法加载主类 cn.test1.test1”错误
  • 原文地址:https://www.cnblogs.com/xfxu/p/4003768.html
Copyright © 2011-2022 走看看