栈和队列——队列的顺序表实现(C语言)

队列(queue)是一种 先进先出(First In First Out, FIFO) 的线性表。

循环顺序队列的C语言实现

头文件

 // 循环顺序队列 ----少用一个元素空间 
#include<stdio.h>
#include<stdlib.h>

//结果函数状态代码 
#define TRUE	1
#define FALSE	0
#define OK		1
#define ERROR		0
#define INFEASIBLE	-1
#define OVERFLOW	-2
#define MAXSIZE 5

typedef int Status;// Status--函数的类型,其值是函数结果的状态代码
typedef int QElemType;
typedef struct
{
	QElemType *base;	//动态分配存储空间
	int front;			//头指针,若队列不空,指向列头元素
	int rear;			//尾指针,若队列不空,指向队列尾元素的下一元素 
}SqQueue;

循环队列初始化

Status InitQueue(SqQueue *Q)		//循环队列初始化
{
	Q->base = (QElemType *)malloc(MAXSIZE*sizeof(QElemType));	//分配内存空间 
	if(!Q->base)	exit(OVERFLOW);		//存储分配失败
	Q->front = Q->rear = 0;			//头指针和尾指针置为0, 队列为空
	return OK; 
}

求循环队列长度

int QueueLength(SqQueue Q)			//求队列循环长度
{
	return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}

清空循环队列

Status ClearQueue(SqQueue *Q)		//清空循环队列
{
	if(Q->front!=Q->rear)	Q->front = Q->rear;
	return OK;
}

销毁循环队列

Status DestroyQueue(SqQueue *Q)		//销毁循环队列
{
	free(Q->base);			//删除内存空间
	Q->front = Q->rear = 0;		// //头指针和尾指针置为0, 队列为空
	return OK;
} 

输出显示循环队列

void ShowQueue(SqQueue Q)			//输出显示循环队列
{
	int i = Q.front%MAXSIZE;
	while(i!=Q.rear)		//队列不为空
	{
		printf("%d,", Q.base[i]);
		i = (i+1)%MAXSIZE;
	}
	printf("\n");
 }

循环队列入队

Status EnQueue(SqQueue *Q, QElemType e)		//循环队列入队
{
	if((Q->rear+1)%MAXSIZE==Q->front) return ERROR;	//队满
	Q->base[Q->rear]=e;		//新元素插入队尾
	Q->rear=(Q->rear+1)%MAXSIZE;		//队尾指针+1
	return OK; 
}

循环队列出队

Status DeQueue(SqQueue *Q, QElemType *e)		//循环队列出队 
{
	if(Q->front==Q->rear)	return ERROR;		//队空
	*e = Q->base[Q->front];						//保存对头元素
	Q->front = (Q->front+1)%MAXSIZE;			//对头指针+1
	return OK; 
}

取队头元素

Status GetHead(SqQueue Q, QElemType *e)			//取队头元素
{
	if(Q.front!=Q.rear)			//队列不为空 
	{
		*e = Q.base[Q.front];	//返回队头元素值,队头指针不变 
		return OK; 
	}
	else return FALSE;
} 

主函数

int main()
{
	Status InitQueue(SqQueue *Q);		//循环队列初始化
	int QueueLength(SqQueue Q);			//循环求队列长度
	Status ClearQueue(SqQueue *Q);		//清空循环队列
	Status DestroyQueue(SqQueue *Q);		//销毁循环队列
	void ShowQueue(SqQueue Q);			//输出显示循环队列
	Status EnQueue(SqQueue *Q, QElemType e);		//循环队列入队
	Status DeQueue(SqQueue *Q, QElemType *e);		//循环队列出队
	Status GetHead(SqQueue Q, QElemType *e);			//取队头元素
	
	SqQueue Q;
	QElemType e;
	InitQueue(&Q);
	int i;
	for(i=0;i<3;i++)
	{
		if(EnQueue(&Q,i))	printf("入队成功:%d\n", Q.base[Q.rear-1]);
		else 
		{
			printf("队满!!!\n");
			break;
		}
	}
	printf("队列长度为:%d\n", QueueLength(Q)); 
	ShowQueue(Q);
	DeQueue(&Q, &e);
	printf("出队元素为:%d\n", e);
	for(i=5;i<9;i++)
	{
		if(EnQueue(&Q,i))	printf("入队成功:%d\n", Q.base[Q.rear-1]);
		else 
		{
			printf("队满!!!\n");
			break;
		}
	}
	ShowQueue(Q);
	ClearQueue(&Q);
	printf("清空,队列长度为:%d\n", QueueLength(Q)); 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值