队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
下面是编程实现的数组队列:
#include <stdio.h>
#define Queue_Size 100
#define OK 0
#define ERROR -1
typedef int dataType ;
typedef struct
{
dataType data[Queue_Size] ;
int rear ; //后
int front ; //前
}SeqQueue ;
//置空队列
int InitQueue(SeqQueue * queue)
{
if(queue == NULL)
{
return ERROR ;
}
queue->rear = 0 ;
queue->front = 0 ;
return OK ;
}
//判断是否为空队
int QueueEmpty(SeqQueue *queue)
{
if(queue == NULL)
{
return ERROR ;
}
return queue->rear == queue->front ;
}
//判断是否满队
int QueueFull(SeqQueue * queue)
{
if(queue == NULL)
{
return ERROR ;
}
return (queue->rear+1)%Queue_Size == queue->front ; //满队返回1,否则返回0
}
//数据入队
int Queue_in(SeqQueue * queue,int mydata)
{
if(queue == NULL)
{
return ERROR ;
}
if(QueueFull(queue) == 1)
{
return ERROR ;
}
queue->rear = (queue->rear+1)%Queue_Size ;
queue->data[queue->rear] = mydata ;
}
//数据出队
int Queue_out(SeqQueue * queue)
{
if(queue == NULL)
{
return ERROR ;
}
if(QueueEmpty(queue) == 1)
{
return ERROR ;
}
queue->front = (queue->front+1)%Queue_Size ;
return queue->data[queue->front] ;
}
//获取队头元素
int GetFront(SeqQueue *queue)
{
if(queue == NULL)
{
return ERROR ;
}
if(QueueEmpty(queue) == 1)
{
return ERROR ;
}
int nPos = (queue->front+1)%Queue_Size ;
return queue->data[nPos] ;
}
int main()
{
SeqQueue queue ;
if(InitQueue(&queue) != OK)
{
return -1 ;
}
if(QueueEmpty(&queue) == 1)
{
printf("空队列\n") ;
}
else
{
printf("不是空队列\n") ;
}
int i ;
for(i=0;i<10;i++)
{
Queue_in(&queue,i);
}
if(QueueEmpty(&queue))
{
printf("空队列\n") ;
}
else
{
printf("不是空队列\n") ;
}
for(i=0;i<10;i++)
{
printf("%4d",Queue_out(&queue));
}
if(QueueEmpty(&queue))
{
printf("空队列\n") ;
}
else
{
printf("不是空队列\n") ;
}
return 0 ;
}
编程实现的链式队列:
#include <stdio.h>
#include <stdlib.h>
#define OK 0
#define ERROR -1
#define MALLOC_ERROR -2
typedef int dataType ;
typedef struct node
{
dataType data ; //队列节点数据
struct node *next ; //节点指针
}Node ;
typedef Node *pNode ;
typedef struct
{
pNode rear ; //队尾指针
PNode front ; //队头指针
}LinkQueue ;
//初始化队列
int InitQueue(LinkQueue *queue)
{
if(queue == NULL)
{
return ERROR ;
}
queue->front = NULL ;
queue->rear = NULL ;
return OK ;
}
//判断是否为空队列
int QueueEmpty(LinkQueue * queue)
{
if(queue == NULL)
{
return ERROR ;
}
return (queue->front == NULL) ;
}
//数据入队
int Queue_in(LinkQueue *queue ,int nData)
{
if(queue == NULL)
{
return ERROR ;
}
pNode node = (pNode)malloc(sizeof(Node)/sizeof(char)) ;
if(node == NULL)
{
return MALLOC_ERROR ;
}
node->data = nData ;
node->next = NULL ;
if(QueueEmpty(queue))
{
queue->front = node ;
queue->rear = node ;
}
else
{
queue->rear->next = node ;
queue->rear = node ;
}
return OK ;
}
//数据出队
int Queue_out(LinkQueue * queue)
{
if(queue == NULL)
{
return ERROR ;
}
if(QueueEmpty(queue) == 1)
{
return ERROR ;
}
pNode p = queue->front ;
int nData = p->data ;
queue->front = p->next ;
if(queue->front == NULL)
{
queue->rear == NULL ;
}
return nData ;
}
int main()
{
SeqQueue queue ;
if(InitQueue(&queue) != OK)
{
return -1 ;
}
if(QueueEmpty(&queue) == 1)
{
printf("空队列\n") ;
}
else
{
printf("不是空队列\n") ;
}
int i ;
for(i=0;i<10;i++)
{
Queue_in(&queue,i);
}
if(QueueEmpty(&queue))
{
printf("空队列\n") ;
}
else
{
printf("不是空队列\n") ;
}
for(i=0;i<10;i++)
{
printf("%4d",Queue_out(&queue));
}
if(QueueEmpty(&queue))
{
printf("空队列\n") ;
}
else
{
printf("不是空队列\n") ;
}
return 0 ;
}
本文介绍了队列这一数据结构的概念及特点,包括入队、出队等基本操作,并提供了数组队列和链式队列的具体实现代码。
2511

被折叠的 条评论
为什么被折叠?



