《数据结构与算法分析——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 ];
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

房东的小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值