- 两种模板:类模板、函数模板
- 泛型编程: 主要用于容器、迭代器、算法-------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 // _