深入理解链式队列
2017-11-07 18:31
218 查看
下面从代码中理解分析队列的链式存储原理。
重点理解一下队列元素的插入
当队列为空,插入第一个结点时,队头队尾指针指向同一个结点,它们值相同,即上面所示的(1)式。
当插入第二个结点时,队尾指针指向的结点,也就是队头指针指向的结点(这点值得注意)的next指针由空被赋值为新元素的地址,即rear->next=new Node(x),此时等价于front->next=new Node(x),都是第一个结点的next指针被赋值;然后队尾指针rear赋值为新元素地址,队尾变更,即rear=new Node(x),此时rear指向的新结点中next指针为空。这两个过程合并起来就是上面所示的(2)式。
之后插入的结点的存储过程类似,先是rear指向的元素的空next指针被赋值为新元素的地址,然后新元素地址赋给队尾rear指针,产生新队尾。
template<class T> class Queue { public: Queue(); ~Queue(); bool isEmpty() const; const T & getFront() const; void enqueue (const T &x); T dequeue(); void makeEmpty(); private: ///////////////////////结点结构 struct Node { T element; Node *next; //初始化为空 Node(const T& data,Node *n=0):element(data),next(n){} }; Node *front; //队头 Node *rear; //队尾 }; ///////////////////////////////////////// template<class T> Queue<T>::Queue() { front=rear=0; //类初始化,队头、队尾指针都为空 } ////////////////////////////////////////// template<class T> Queue<T>::~Queue() //析构函数 { makeEmpty(); } template<class T> void Queueli<T>::makeEmpty() { front=rear=0; } //////////////////////////////////////////// template<class T> bool Queue<T>::isEmpty() const //判断是队列是否为空 { return front==0; } /////////////////////////////////////////// template<class T> const T& Queue<T>::getFront() const { if(isEmpty()) throw "empty!"; return front->element; } ///////////////////////////////////////// template<class T> void Queue<T>::enqueue(const T &x) { if(isEmpty()) rear=front=new Node(x); else rear=rear->next=new Node(x); } ////////////////////////////////////// template<class T> T Queue<T>::dequeue() { T frontitem=getFront(); Node *old=front; front=front->next; delete old;//删除原front指向的对象,队头指向下一个对象 return frontitem; }
重点理解一下队列元素的插入
template<class T> void Queue<T>::enqueue(const T &x) { if(isEmpty()) rear=front=new Node(x); ..........................(1) else rear=rear->next=new Node(x); ..........................(2) }
当队列为空,插入第一个结点时,队头队尾指针指向同一个结点,它们值相同,即上面所示的(1)式。
当插入第二个结点时,队尾指针指向的结点,也就是队头指针指向的结点(这点值得注意)的next指针由空被赋值为新元素的地址,即rear->next=new Node(x),此时等价于front->next=new Node(x),都是第一个结点的next指针被赋值;然后队尾指针rear赋值为新元素地址,队尾变更,即rear=new Node(x),此时rear指向的新结点中next指针为空。这两个过程合并起来就是上面所示的(2)式。
之后插入的结点的存储过程类似,先是rear指向的元素的空next指针被赋值为新元素的地址,然后新元素地址赋给队尾rear指针,产生新队尾。
相关文章推荐
- 如何阅读深入理解计算机系统
- ORACLE时间函数(SYSDATE)深入理解
- 深入理解Java:SimpleDateFormat安全的时间格式化
- 深入理解JavaScript中的this关键字
- [深入理解Android卷一全文-第一章]阅读前的准备工作
- Java中HashMap和TreeMap的区别深入理解
- 深入理解JavaScript系列 ----(6):SOLID五大原则之单一职责
- 深入理解计算机体系结构-----之 第三章 程序的机器级表示
- java基础梳理-【转】深入理解接口及抽象类
- 深入理解Java内存模型(四)——volatile
- 深入理解js 闭包
- [深入理解MySQL系列] - sort_buffer
- 针对fork()函数的深入理解!用事例family家谱来进行说明!
- 深入理解跨站点 WebSocket 劫持漏洞的原理及防范
- [深入理解Android卷一全文-第八章]深入理解Surface系统
- 深入理解计算机系统(4.2)---硬件的魅力
- 深入理解JavaScript系列(40):设计模式之组合模式
- 深入理解C++的动态绑定和静态绑定
- 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC
- 深入理解Java内存模型(五)——锁