C++ 手动实现队列(queue) (课后作业版)

#include <iostream>

using namespace std;

template <typename T>
class Queue {
public:
    Queue();
    Queue(int n);
    Queue(Queue<T>& Queue);
    ~Queue();
    T& top();
    Queue<T>& push(const T& elem);
    Queue<T>& pop();
    void reserve(int num);
    int size();
    int capciaty() {return cap; }
    int is_empty() {return in == out; }
    bool is_full() {return (in+1)%cap == out; }
    void clear() {this->~Queue();}
    T* arr;
private:

    int out;   //出栈口
    int in;    //进栈口
    int cap;
};

//默认构造函数
template <typename T>
Queue<T>::Queue() {
    cap = 0;
    out = 0;
    arr = nullptr;
}

//一般构造函数
template <typename T>
Queue<T>::Queue(int n) {
    cap = n;
    out = 0;
    in = 0;
    arr = new T[n]{};
}

//拷贝构造函数(前浅贝)
template <typename T>
Queue<T>::Queue(Queue<T>& Queue) {
    cap = Queue.cap;
    out = Queue.out;
    in  = Queue.in;
    this->arr = Queue.arr;
}

//析构函数
template <typename T>
Queue<T>::~Queue() {
    if ( cap == 0 ) {
        return;
    }
    cap = 0;
    out = 0;
    in  = 0;
    delete [] arr;
    arr = nullptr;
}

//访问栈顶
template <typename T>
T& Queue<T>::top() {
    if ( is_empty() ) {
        cout << "[error]: Queue has no element" << endl;
    }
    return *(arr+out);
}

//在栈顶添加一个元素
template <typename T>
Queue<T>& Queue<T>::push(const T& elem) {
    if ( is_full() ) {
        reserve(2*cap);
    }
    arr[in] = elem;
    in = (in+1) % cap;
    return *this;
}

//栈顶弹出
template <typename T>
Queue<T>& Queue<T>::pop() {
    if ( is_empty() ) {
        cout << "[error]: don't try to pop a empty Queue" << endl;
        return *this;
    }
    out = (out+1) % cap;
    return *this;
}

//获取当前元素个数
template <typename T>
int Queue<T>::size() {
    if ( is_empty() )
        return 0;
    else if ( is_full() ) {
        return cap-1;
    }
    if ( out <= in )
        return in-out;
    else
        return cap-(out-in);
}

//增加容量
template <typename T>
void Queue<T>::reserve(int num) {
    if ( num < cap ) {
        cout << "[warning]: input of reserve() function shuold lager than capciaty" << endl;
        return;
    }
    T *arr_ = new T[num]{};
    for ( int i = 0; i < cap; i++ )
        arr_[i] = arr[i];
    delete [] arr;
    arr = arr_;
    arr_ = nullptr;
    cap = num;
    in = out + size();
}

int main() {
    Queue<int> Queue(3);
    if ( Queue.is_empty() )
        cout << "Queue is a empty queue" << endl;
    Queue.push(8);
    cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
    Queue.push(4);
    cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
    Queue.push(5);
    cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
    Queue.push(5);
    cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
    Queue.pop();
    Queue.pop();
    cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
    Queue.clear();
    cout << "top=" << Queue.top() << ", 容量=" << Queue.capciaty() << ", 元素个数=" << Queue.size() << endl;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值