一、队列
参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。
1、链队列
队列和栈恰恰相反,队列是一种先进先出的结构(FIFO),它也是一种线性表,也有两种存储结构:链队列和顺序循环队列。 队列只允许在表的一端插入,只允许在另一端删除。和我们平常排队是一个模样,允许插入(入队)的一端叫队尾,允许删除(出队)的一端叫队头,表示图如下: 而在实际情况当中,我们将表写成下面这样: 链队列定义了队头指针和队尾指针,所以判空队列标志在于:Q.front == Q.rear; 并且:
当队为空时,入队会改变头和尾指针; 当队非空时,入队只会改变尾指针;
相关代码:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
typedef char QElemType;
typedef struct QNode {
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q);
Status InitQueue(LinkQueue &Q) {
Q.front = Q.rear = new QNode;
if(!Q.front) exit(OVERFLOW);
Q.front->next = NULL;
return OK;
}
Status EnQueue(LinkQueue &Q,QElemType e);
Status EnQueue(LinkQueue &Q,QElemType e) {
QueuePtr p;
p = new 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);
Status DeQueue(LinkQueue &Q,QElemType &e) {
if(Q.front == Q.rear) return ERROR;
QueuePtr p;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p) Q.rear = Q.front;
free(p);
return OK;
}
Status QueueDisPlay(LinkQueue &Q);
Status QueueDisPlay(LinkQueue &Q) {
if(Q.front == Q.rear) return ERROR;
QueuePtr p;
p = Q.front->next;
while(p){
if(p->next != NULL)
printf("%c,",p->data);
else {
printf("%c",p->data);
}
p = p->next;
}
}
int main(void) {
LinkQueue Q;
InitQueue(Q);
QElemType ch;
char e;
printf("请输入入队元素(可分段输入(输入最后一段Enter后按Ctrl+Z)):\n");
while((ch=getchar()) != EOF){
if(ch == '\n')
continue;
else
EnQueue(Q,ch);
}
DeQueue(Q,e);
printf("整个队列队头元素为:%c\n",e);
printf("剩余队列元素依次为:\n");
QueueDisPlay(Q);
return 0;
}
|