您的位置:首页 > 其它

队列

2015-12-30 11:33 344 查看
队列:Queue FIFO

队首(front)允许删除的一端
队尾(rear)允许插入的一端

静态队列: 使用数组存储,设立一个队首指针front,一个队尾指针rear,
front = rear = 0;
1、入队 rear + 1
2、出队 front + 1 ,返回出队元素
3、空队列 front = rear;
4、rear = MAX_QUEUE_SIZE - 1或front = rear;

循环队列:用来克服队列“假溢出”现象(front和rear只加不减,有可能超过指针上界)
1、当队首或队尾指针指向向量上界(MAX_QUEUE_SIZE - 1), + 1操作变为指向向量下界0
2、只用front = rear,不能判断是空队列,还是满队列
3、循环队列满:(rear + 1)%MAX_QUEUE_SIZE = front

#include <stdio.h>
#include <stdlib.h>

#define  MAX_QUEUE_SIZE 5
#define ERR -1
#define OK  0

typedef int ElemType;

typedef struct SqQueue
{
ElemType Queue_array[MAX_QUEUE_SIZE];
int front;
int rear;
};

SqQueue Init_CirQueue()
{
SqQueue q;
q.front = q.rear = 0;
return q;
}

int Push_CirQueue(SqQueue *s, ElemType e)
{
if ((s->rear + 1) % MAX_QUEUE_SIZE == s->front) //栈满
{
return ERR;
}
s->Queue_array[s->rear] = e;
s->rear = (s->rear + 1) % MAX_QUEUE_SIZE;
return OK;
}

int Pop_CirQueue(SqQueue *q, ElemType *e)
{
if (q->front + 1 == q->rear)
{
return ERR;
}
*e = q->Queue_array[q->front];
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return OK;
}

int main(void)
{
SqQueue cirQ = Init_CirQueue();

for (int i = 0; i < 5; i++)
{
Push_CirQueue(&cirQ, i);
}
system("pause");
return 0;
}


队列的链式存储:单链表,需要两种结点,一种是数据结点,一种是队首队尾指针的结点

typedef struct QNode
{
ElemType data;
struct QNode *next;
};

typedef struct link_queue
{
QNode *front;
QNode *rear;
}Link_Queue;

Link_Queue* Init_Qnode()
{
QNode *p;
Link_Queue *q;
p = (QNode*)malloc(sizeof(QNode));
p->next = NULL;

q = (Link_Queue *)malloc(sizeof(Link_Queue));
q->front = q->rear = p;
return q;
}

int Insert_Link_Queue(Link_Queue *q, ElemType e)
{
QNode *p;
if (q)
{
return ERR;
}
p = (QNode*)malloc(sizeof(QNode));
p->data = e;
p->next = NULL;
//p->next = q->rear->next;
q->rear->next = p;
q->rear = q->rear->next;
return OK;
}

int Delete_Link_Queue(Link_Queue *q, ElemType *e)
{
QNode *p;
p = q->front->next;
if (q->front == q->rear)
{
return ERR;
}
*e = p->data;
q->front->next = p->next;

if (p == q->rear)//如果只有一个结点因为出栈只能时Q->FRONT,既此时q->front和q->rear相等
{
q->rear == q->front;
}
free(p);

return OK;
}

void Destroy_LinkQueue(Link_Queue *q)
{
while (q->front != NULL)
{
q->rear = q->front->next;
free(q->front);
q->front = q->rear;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: