目录
队列的顺序存储结构
顺序队声明
typedef struct
{
ElemType data[MaxSize];
int front,rear; // 队头和队尾指针
}SqQueue;
初始化队列
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=-1;
}
销毁队列
void DestroyQueue(SqQueue *&q)
{
free(q);
]
判断队列是否为空
bool QueueEmpty(SqQueue *q)
{
return(q->front==q->rear);
}
进队列
bool enQueue(SqQueue *&q,ElemType e)
{
if(q->rear==MaxSize-1) //队满上溢出
return false; //返回假
q->rear++;
q->data[q->rear]=e; //rear位置插入元素E
return true;
}
出队列
bool deQueue(SqQueue *&q,ElemType &e)
{
if(q->front==q->rear) //队空下溢出
return false;
q->front++;
e=q->data[q->front];
return true;
}
循环队列
初始化队列
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q=front=q->rear=;
}
销毁队列
void DestroyQueue(SqQueue *&q)
{
free(q)
}
判断队列是否为空
bool QueueEmpty(SqQueue *q)
{
return(q->front==q->rear);
}
进队列
bool enQueue(Squeue *&q,ELemType e)
{
if((q->rear+1)%MaxSize==q->front) //队满上溢出
return false;
q->rear=(q->rear+1)%MaxSize;
q->data[q->rear]=e;
return true;
}
出队列
bool deQueue(SqQueue *&q,ElemType e)
{
if(q->front==q->rear) // 队空下溢出
return false;
q->front=(q->front+1)%MaxSize;
e=q->data[q->front];
return trur;
}
队列的链式存储
数据节点类型声明
typedef struct qnode
{
ElemType data; //存放元素
struct qnode *next; //下一个结点指针
}DataNode; //链队数据节点类型
链队头结点
typedef struct
{
DataNode *front; //指向队首结点
DataNode *rear; //指向队尾结点
}LinkQuNode; //链队结点类型
初始化队列
void DestroyQueue(LinkQuNode *&q)
{
q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL;
}
销毁队列
void DestroyQueue(LinkQuNode *&q)
{
DataNode *pre=q->front,*p; //pre指向队首结点
if(pre!=NULL)
{
p=pre->next; //p指向pre的后继结点
while(p!=NULL)
{
free(pre);
pre=p;p=p->next; //pre、p同步后移
}
free(pre};
}
free(q);
}
//O(n)
判断队列是否为空
bool QueueEmpty(LinkQuNode *q)
{
return(q->rear==NULL);
}
进队列
void enQueue(LinkQuNode *&q,ElemType e)
{
DataNode *p;
p=(DataNode *)malloc(sizeof(DataNode)); //创建新结点
p->data=e;
p->next=NULL;
if(q->rear==NULL) //若队列为空,则新结点既是队首结点也是队尾结点
q->front=q->rear=p;
else
{
q->rear->next=p //将结点P链到队尾,并将rear指向它
q->rear=p;
}
}
出队列
bool deQueue(LinkQuNode *&q,ElemType &e)
{
DataNode *t;
if(q->rear==NULL) //原来队列空
return false;
t=q->front;
if(q->front==q->rear) //原来队列中只有一个结点
q->front=q->rear=NULL;
else //原来队列中有两个及两个以上的结点时
q->front=q->front->next;
e=t->data;
free(t);
return true;
}