首页 > 编程语言 > 详细

C++实现队列

时间:2020-06-06 12:11:54      阅读:36      评论:0      收藏:0      [点我收藏+]
#ifndef UNTITLED_QUEUE_H
#define UNTITLED_QUEUE_H
#include <iostream>
template<typename T>
class Queue{
private:
    int Capacity;//容量
    int Size;//大小
    int front;//对头
    int rear;//队尾
    T *data;

public:
    Queue(int size = 100);
    ~Queue();
    int size();//返回大小
    int capacity();//返回容量
    bool empty();//判空
    bool full();//判满
    void clear();//清空
    void reSize(int n);//调整容量
    void destroy();//销毁队列
    void push(const T x);//入队
    void traverse();//遍历
    T pop();//出队
    T head();//队首元素
    Queue &operator=(const Queue &q);//拷贝赋值函数

};
template<typename T>
Queue<T>::Queue(int size){
    Capacity = size;
    data = new T[size];
    front = rear = 0;
}
template<typename T>
Queue<T>::~Queue(){
    destroy();
}

//返回大小
template<typename T>
int Queue<T>::size(){
    return Size;
}

//返回容量
template<typename T>
int Queue<T>::capacity(){
    return Capacity;
}

//判空
template<typename T>
bool Queue<T>::empty(){
    return Size;
}

//判满
template<typename T>
bool Queue<T>::full(){
    return Size + 1 == Capacity;
}

//清空
template<typename T>
void Queue<T>::clear(){
    Size = 0;
    front = rear = 0;
}

//销毁队列
template<typename T>
void Queue<T>::destroy(){
    if (data)
        delete [] this->data;
    data = nullptr;
    Size = 0;
    Capacity = 0;
    front = rear = 0;
}

//调整容量
template<typename T>
void Queue<T>::reSize(int n){
    T *p = new T[n];
    for (int i = 0; i < Capacity; ++i) {
        p[i] = data[i];//如果是对象必须有拷贝赋值函数
    }
    this->Capacity = n;
    delete [] data;
    data = p;
}

//入队
template<typename T>
void Queue<T>::push(const T x){
    if (full())
        reSize(2 * Capacity);
    data[rear] = x;
    rear = (rear + 1) % Capacity; //在reSize()前这里就已经归0了。
    Size++;
}

//出队
template<typename T>
T Queue<T>::pop(){
    if (!empty()){
        std::cerr << "队空的,无法出队!\n";
        return 0;
    }
    T r = data[front];
    front = (front + 1) % Capacity;
    Size--;
    return r;
}

//拷贝赋值函数
template<typename T>
Queue<T> &Queue<T>::operator=(const Queue &q){
    if (data)
        destroy();
    Capacity = q.Capacity;
    data = new T[Capacity];
    Size = q.Size;
    for (int i = 0; i < q.Size; ++i) {
        data[i] = q.data[i];
    }
    rear = q.rear;
    front = q.front;
    return *this;
}

//队首元素
template<typename T>
T Queue<T>::head() {
    if (!empty()){
        std::cerr << "队空的,没有队首!\n";
        return 0;
    }
    return data[front];
}

//遍历
template<typename T>
void Queue<T>::traverse() {
    for (int i = front, c = 0; c < Size; ++c) {
        std::cout <<" " << data[i];
        i = (i+1) % Capacity;
    }
    std::cout << std::endl;
}
#endif //UNTITLED_QUEUE_H

 

C++实现队列

原文:https://www.cnblogs.com/niubidexiebiao/p/13053338.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!