队列 线性数据结构的一种。数据结构
特色 先进先出spa
入队的那一头叫队尾,出队的那一头叫队首。指针
队列里的指针域老是指向下一个节点。
code
下面是队列的链式存储结构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"); } } }
队列的顺序存储结构能够实现循环队列。(此处记录下之后会有代码实现)
element
下面是关于栈和队列的使用练习
it
一、把一个十进制的数转换为一个二进制的数,例如9转换为二进制是1001,可使用栈来实现。io
二、用两个栈来实现一个队列,完成队列的Push和Pop操做。 队列中的元素为int类型。class