《C++ primer 》 猎豹网校 模板与泛型编程 2018/10/9

本文介绍了一种使用C++实现的泛型队列数据结构,包括队列的基本操作如push和pop,以及如何检查队列是否为空。通过模板类的形式,该队列可以用于多种数据类型,展示了泛型编程在C++中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 两种模板:类模板、函数模板
  • 泛型编程:   主要用于容器、迭代器、算法-------C++ STL标准模板库
  • 示例:

1,普通队列

2.C++中的泛型队列  

3.顺序队列

4.链式队列

队列——顺序队列   ---系统软件开发,系统的线程池

先进先出(FIFO)或后进后出(LILO)

队首、队尾

队列的操作,push  pop,b

#include <iostream>
#include "顺序队列.h"
#include <algorithm>
using namespace std;

int main()
{
    cout <<"测试顺序队列"<<endl;

    Queue<int> q(5);

    q.Push('A');
    q.Push('B');
    q.Push('C');
    cout <<q.Front() << " ," <<q.Rear()<<endl;
    q.Push('D');
    q.Push('E');
    cout <<q.Front() << " ," <<q.Rear()<<endl;

     cout <<q.Front() << " ," <<q.Rear()<<endl;
     q.Push('100');
      cout <<q.Front() << " ," <<q.Rear()<<endl;
    return 0;

}
#ifndef _顺序队列_H
#define _顺序队列_H

#include <algorithm>
template<class T>
class Queue
{
public:
    Queue(int queueCapacity = 10);  //构造函数,默认值为10
    bool IsEmpty() const;           //判断队列是否为空
    T& Front() const;                //查看队首的数据
    T& Rear() const;                   //查看队尾的数据
    void Push(const T& item);
    void Pop();
private:
    T *queue;
    int front;
    int rear;
    int capacity;
};

//构造函数,将缺省值传给初始化列表,capacity
template<class T>
Queue<T>::Queue(int queueCapacity):capacity(queueCapacity)
{
    if(capacity < 1) throw "Queue capacity must be >0";
    queue = new   T[capacity];
    front = rear = 0;
}

template<class T>
inline bool Queue<T>::IsEmpty() const
{
    return front == rear;   //头和尾的位置相同  即为空
}

template<class T>
void Queue<T>::Push(const T &item)
{
//    if(rear == capacity-1)
//        rear = 0;
//    else
//        rear++;
    if((rear+1)%capacity == front) //队列满了
    {
        //加倍
        T* newQueue = new T[2*capacity];
        int start = (front +1) %capacity;
        if(start <2) //没有回转
            copy(queue+start,queue+start+capacity-1,newQueue);
        else
        {
            copy(queue+start,queue+capacity,newQueue);
            copy(queue,queue+rear+1,newQueue+capacity-start);
        }
        front = 2*capacity-1;
        rear = capacity-2;
        capacity *= 2;
        delete[] queue;
        queue = newQueue;

    }
    rear = (rear+1)%capacity; //高水平
    queue[rear] = item;

}

template<class T>
inline T& Queue<T>::Front() const
{
    if(IsEmpty()) throw "Queue is empty ,No Front element";
    return queue[(front +1) %capacity];
}

template<class T>
inline T& Queue<T> ::Rear() const
{
    if(IsEmpty())   throw "Queue is empty ,no rear element";
    return queue[rear];
}

template<class T>
void Queue<T>::Pop()
{
    if(IsEmpty()) throw "Queue is empty .Canot delete.";
    front = (front+1) %capacity;
    queue[front].~T();
}

#endif // _

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值