也可以看成循环队列的。需要仔细,重点是插入与弹出,结合前篇的绘图,总结逻辑是:
1先外部元素建立连接
2后内部元素改变连接
3改变内部元素连接时,留意前驱或后驱是否为空时的特例。
以下是自定义实现:
//circularqueue.h
#ifdef _MSC_VER
#pragma once
#endif // _MSC_VER
#ifndef CIRCULAR_QUEUE_h_H_
#define CIRCULAR_QUEUE_h_H_
#include<cstdlib>
#include<cassert>
/** 此容器保存的数据类型 */
typedef int DataType;
/** 结点类型 */
struct Node
{
DataType data_;
Node* next_;
Node* prev_;
};
class CircularQueue
{
Node* pFront; ///< 指向头结点
Node* pBack; ///< 指向尾结点
int maxSize_; ///< 最大可用容量
int size_; ///< 已使用的容量
public:
/** 构造函数,传入最大容量参数 */
explicit CircularQueue(int maxSize);
~CircularQueue();
/** 从尾部插入 */
int push_back(DataType data);
/** 从头部弹出 */
int pop_front();
/** 返回头结点的数据 */
DataType front();
/** 已使用的容量 */
int size();
/** 空队判断