队列 线性数据结构的一种。
特点 先进先出
入队的那一头叫队尾,出队的那一头叫队首。
队列里的指针域总是指向下一个节点。
下面是队列的链式存储结构C代码实现
#include <stdio.h>#include <stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int QElemType;typedef int Status;/*
* 存储结构
*/typedef struct QNode
{
QElemType data; struct QNode *next;
}QNode, *QueuePtr;typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针}LinkQueue;/*
* 初始化队列
*/Status InitQueue(LinkQueue *Q){
Q->front = Q->rear = (QueuePtr) malloc(sizeof(QNode)); if (!Q->front)
{ exit(OVERFLOW);
}
Q->front->next = NULL; return OK;
}/*
* 销毁队列
*/Status DestroyQueue(LinkQueue *Q){ while (Q->front)
{
Q->rear = Q->front->next; free(Q->front);
Q->front = Q->rear;
} return OK;
}/*
* 清空队列
*/Status ClearQueue(LinkQueue *Q){
DestroyQueue(Q);
InitQueue(Q);
}/*
* 判断队列是否为空
*/Status IsEmpty(LinkQueue Q){ if (Q.front->next == NULL)
{ return TRUE;
} else
{ return FALSE;
}
}/*
* 获取队列的长度
*/int GetLength(LinkQueue Q){ int i = 0;
QueuePtr p = Q.front; while (Q.rear != p)
{
i++;
p = p->next;
} return i;
}/*
* 获取队头元素
*/Status GetHead(LinkQueue Q, QElemType *e){
QueuePtr p; if (Q.front == Q.rear)
{ return ERROR;
}
p = Q.front->next;
*e = p->data; return OK;
}/*
* 入队
*/Status EnQueue(LinkQueue *Q, QElemType e){
QueuePtr p = (QueuePtr) malloc(sizeof(QNode)); if (!p)
{ exit(OVERFLOW);
}
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p; return OK;
}/*
* 出队
*/Status DeQueue(LinkQueue *Q, QElemType *e){
QueuePtr p; if (Q->front == Q->rear)
{ return ERROR;
}
p = Q->front->next;
*e = p->data;
Q->front->next = p->next; if (Q->rear == p)
{
Q->rear = Q->front;
} free(p); return OK;
}/*
* 访问元素
*/void visit(QElemType e){ printf("%d ", e);
}/*
* 遍历队列
*/Status TraverseQueue(LinkQueue Q, void (*visit)(QElemType)){
QueuePtr p = Q.front->next; while (p)
{
visit(p->data);
p = p->next;
} return OK;
}int main(){
LinkQueue Q; if (InitQueue(&Q))
{
QElemType e; int i; printf("init_success\n"); if (IsEmpty(Q))
{ printf("queue is empty\n");
} for (i = 0; i < 10; i++)
{
EnQueue(&Q, i);
}
GetHead(Q, &e); printf("The first element is %d\n", e); printf("length is %d\n", GetLength(Q));
DeQueue(&Q, &e); printf("delete element is %d\n", e);
TraverseQueue(Q, *visit); if (DestroyQueue(&Q))
{ printf("\ndestroy_success\n");
}
}
}
队列的顺序存储结构可以实现循环队列。(此处记录下以后会有代码实现)
下面是关于栈和队列的使用练习
1、把一个十进制的数转换为一个二进制的数,例如9转换为二进制是1001,可以使用栈来实现。
2、用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
来源:oschina
链接:https://my.oschina.net/u/2241804/blog/648520