C语言实现顺序队列的各种操作

C语言-顺序队列的基本操作

一、我们先明确一下什么是队列?
队列(Queue):只允许在表的一端进行插入,另外一端进行删除
入队/进队:插入元素
出队/离队:删除元素
队头:允许删除的一端
队尾:允许插入的一端

二、顺序队列的存储结构是怎样的呢?
队列的顺序存储结构如下:
我们开辟了12个连续的int型存储空间,10个存储数据,1个存储队头指针,1个存储队尾指针。

#include
#include
#define MaxSize 10

typedef struct{
	int data[MaxSize];
	int front,rear;			//定义队头,队尾指针,其值代表数组下标 
}SqQueue;

三、顺序队列的基本操作:
1、初始化,让队头,队尾指针数值都为0,即默认都指向data[0]。

//初始化队列
void InitQueue(SqQueue *Q){
	Q->front = Q->rear = 0;		//队头,队尾初始化时都指向data[0] 
} 

2、判断队列是否为空,头尾指针若一样,则为空。

//判断队列是否为空
int QueueEmpty(SqQueue Q){
	if(Q.front == Q.rear)
		return 1;
	else
		return 0;
} 

3、入队,队不满时,先赋值到队尾元素,再把队尾指针加1

//入队 
int EnQueue(SqQueue *Q,int n){
	if(Q->rear==MaxSize)			//队满 
	{
		printf("队列已满,插入元素失败");
		return 0;
	}
	Q->data[Q->rear] = n;	 //把元素插入队尾 
	Q->rear += 1;			//队尾指针加1取模 
	return 1;
}

4、出队,队不空时,先取队头元素,再把队头指针加1

//出队 
int Dequeue(SqQueue *Q){
	int top_number;
	if(Q->rear == Q->front){
		printf("队列为空,出队失败");
		return 0;
	}
	top_number = Q->data[Q->front];
	Q->front += 1;
	return top_number;
} 

5、获取队头元素,但是指针不动

//获取队头元素
int GetHead(SqQueue Q){
	if(Q.rear == Q.front){
		printf("队列为空");
		return 0;
	}
	return Q.data[Q.front];
} 

6、获取队列元素个数

//获取队列元素个数 
int GetSum(SqQueue Q){
	return Q.rear-Q.front;
} 

7、销毁队列

void DestroyQueue(SqQueue *Q){
	free(Q);
} 

8、测试代码

void main(){
	SqQueue Q;
	InitQueue(&Q);
	EnQueue(&Q,5);
	EnQueue(&Q,6);
	EnQueue(&Q,7);
	printf("队列里元素个数为%d\n", GetSum(Q));
	printf("队头元素为%d\n",GetHead(Q));
	printf("出队:%d\n",Dequeue(&Q));
	DestroyQueue(&Q);	
} 

你可能感兴趣的:(数据结构,c语言,数据结构,队列)