类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的有穷线性表
操作集:
void make_empty( Q ptrq ); //初始化栈
int IsEmpty( Q ptrq ); //判断队列是否为空,若为空,返回1,否则返回0
void EnQueue ( ElementType x, Q ptrq ); //入队
ElementType DeQueue( Q ptrq ); //出队
ElementType GetTop( Q ptrq ); //读取队头元素
特点:
(1)队列是一种操作受限的线性表,只允许在表的一端进行插入(表尾),在表的另一端进行删除(表头);
(2)先来先服务,先进先出(First In First Out)(FIFO)。
循环队列实现如下:
//队列的顺序实现——循环队列
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
#define Maxsize 10
typedef struct queue{
ElementType data[Maxsize];
int rear;
int front;
}Queue;
typedef Queue* Q;
void make_empty( Q ptrq ); //初始化栈
int IsEmpty( Q ptrq ); //判断栈是否为空,若为空,返回1,否则返回0
void EnQueue ( ElementType x, Q ptrq ); //入队
ElementType DeQueue( Q ptrq ); //出队
ElementType GetTop( Q ptrq ); //读取队头元素
int main ( void )
{
Queue q;
Q ptrq = &q;
make_empty( ptrq );
int i;
for( i = 0; i < 5; i++ )
EnQueue ( i, ptrq );
for( i = 0; i < 5; i++ )
DeQueue( ptrq );
int len = ( ptrq -> rear - ptrq -> front + Maxsize ) % Maxsize;
if( IsEmpty( ptrq ) )
printf( "表空\n" );
else
printf( "表不空,有元素Len = %d个\n", len );
for( i = 5; i < 12; i++ )
EnQueue ( i, ptrq );
for( i = 0; i < 3; i++ )
DeQueue( ptrq );
len = ( ptrq -> rear - ptrq -> front + Maxsize ) % Maxsize;
if( IsEmpty( ptrq ) )
printf( "表空\n" );
else
printf( "表不空,有元素Len = %d个\n", len );
ElementType x = GetTop( ptrq );
printf( "队头元素是:%d\n", x );
return 0;
}
void make_empty( Q ptrq )
{
ptrq -> rear = 0;
ptrq -> front = 0;
}
int IsEmpty( Q ptrq )
{
return ptrq -> rear == ptrq -> front;
}
void EnQueue ( ElementType x, Q ptrq )
{
if( ( ptrq -> rear + 1 ) % Maxsize == ptrq -> front ){
printf( "队满\n" );
exit(0);
}
ptrq -> data[ ptrq -> rear ] = x;
ptrq -> rear = ( ptrq -> rear + 1 ) % Maxsize;
}
ElementType DeQueue( Q ptrq )
{
if( IsEmpty( ptrq ) ){
printf( "队空\n" );
exit(0);
}
ElementType temp = ptrq -> data[ ptrq -> front ];
ptrq -> front = ( ptrq -> front + 1 ) % Maxsize;
}
ElementType GetTop( Q ptrq )
{
if( IsEmpty( ptrq ) ){
printf( "队空\n" );
exit(0);
}
return ptrq -> data[ ptrq -> front ];
}