《数据结构与算法分析——C语言描述》第三章 队列基本概念及循环队列实现(C语言)

类型名称:队列(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 ];
} 

猜你喜欢

转载自blog.csdn.net/qq_40344308/article/details/88697161