c++ 队列Queue的实现 - 练习题

来源:互联网 发布:律师知乎 编辑:程序博客网 时间:2024/05/29 02:36
#include <iostream>using namespace std;class Queue{private:Queue(Queue &q):maxlength(0){} // 将这2者私有,从而禁用复构和=号Queue& operator=(Queue &q){}struct ListNode{int val;struct ListNode* next;ListNode(int v):val(v),next(0){}~ListNode(){// next指针指向的内存不能再这里进行删除,需要在下个节点的析构函数中删除cout<<"node value "<<val<<" has been deleted!"<<endl;}};ListNode *head;ListNode *tail;const int maxlength; // const常量只能使用列表初始化,(还有引用也是)int length;public:Queue():head(0), tail(0), length(0), maxlength(INT_MAX){}Queue(int sz):head(0), tail(0), length(0), maxlength(sz){}bool isempty(){return !length;}bool isfull(){return length==maxlength;}// 队尾加入节点void push(int v){if(length==maxlength){cerr<<"!reach max length "<<maxlength<<endl;return;}ListNode *tmp = new ListNode(v);if (isempty())head = tmp;elsetail->next = tmp;tail = tmp;length ++;}// 队首移除节点void pop(){if (isempty()){cerr<<"!queue is empty, nothing to pop"<<endl;return;}ListNode *tmp = head;head = head->next;tmp->next = 0;delete tmp; // 释放头指针指向的空间length --;}int front(){if (head)return head->val;elsecerr<<"!queue is empty, cannot get front "<<endl;return -1;}// 获取队列中的元素个数int getNum(){return length;}// 析构函数~Queue(){ListNode *tmp;while (head){tmp = head; // tmp 依次指向每个节点,进行释放head = head->next;tmp->next = 0;delete tmp;}}};int main(){{Queue q(5);//Queue w = q; // 这句话会被编译器提示 复构函数 不可访问!Queue w;//w = q; // 这句话会被编译器提示 operator= 不可访问!q.front();q.pop();for(int i=0;i<8;i++)q.push(i);cout<<"q.num: "<<q.getNum()<<endl;cout<<"q.front: "<<q.front()<<endl;q.pop();cout<<"q.num: "<<q.getNum()<<endl;cout<<"q.front: "<<q.front()<<endl;}cin.get();}


运行结果如下:




值得注意的几点:

  1. Queue的 析构函数,如何释放链表所占的内存
  2. 禁用 复制构造函数 和 =运算符 的方法,c++11中可在函数后加 delete 实现函数禁用!
  3. 类内嵌套类或结构体,如写在private中则只能类内使用,如写在public中则可以通过 Queue::ListNode 进行访问!
  4. 对于const常量和引用变量,只能以列表初始化的形式进行初始化!因为在进入构造函数的函数体之前,对象就已经生成了!列表初始化仅用于构造函数!

0 0
原创粉丝点击