顺序队列基本操作的实现

顺序队列和前面的顺序表一样,相当于一个数组,不同的是它的有效区间,当数组走到最大时,又会从头开始,这里用head 和tail两个下标来表示头和尾,即当tail到达size时,tail又从0开始,head也是同样的道理;

代码如下:

seqqueue.h

#pragma once

#define SeqQueueMaxSize 1000

typedef char SeqQueueType;

typedef struct SeqQueue{
	SeqQueueType data[SeqQueueMaxSize];
	size_t head;
	size_t tail;
	size_t size;
}SeqQueue;
//初始化
void SeqQueueInit(SeqQueue* q);
//销毁
void SeqQueueDestroy(SeqQueue* q);
//入队列
void SeqQueuePush(SeqQueue* q,SeqQueueType value);
//出队列
void SeqQueuePop(SeqQueue* q);
//去队首元素
int SeqQueueFront(SeqQueue* q, SeqQueueType* value);

seqqueue.c

#include <stdio.h>
#include <stdlib.h>
#include "seqqueue.h"

void SeqQueueInit(SeqQueue* q){
	if(q == NULL){
		//非法输入
		return;
	}
	q->size = 0;
	q->head = 0;
	q->tail = 0;
	return;
}

void SeqQueueDestroy(SeqQueue* q){
	if(q ==	NULL){
		return;
	}
	q->size = 0;
	q->head = 0;
	q->tail = 0;
	return;
}

void SeqQueuePush(SeqQueue* q,SeqQueueType value){
	if(q ==	NULL){
		return;
	}
	if(q->size >= SeqQueueMaxSize){
		//队列满了
		return;
	}
	q->data[q->tail] = value;
	q->tail++;
	if(q->tail >= SeqQueueMaxSize){
		q->tail = 0;
	}
	q->size++;
	return;
}

void SeqQueuePop(SeqQueue* q){
	if(q == NULL){
		//非法输入
		return;
	}
	if(q->size == 0){
		//空队列
		return;
	}
	q->head++;
	if(q->head >= SeqQueueMaxSize){
		q->head = 0;
	}
	q->size--;
	return;
}

int SeqQueueFront(SeqQueue* q,SeqQueueType* value){
	if(q == NULL){
		//非法输入
		return 0;
	}
	if(q->size == 0){
		//空队列
		return 0;
	}
	*value = q->data[q->head];
	return 1;
}

test.c

#include <stdio.h>
#define TEST_HEADER printf("\n==========================%s==========================\n",__FUNCTION__)

void SeqQueuePrintChar(SeqQueue* q,const char* msg){
	printf("[%s]\n",msg);
	size_t i =q-> head;
	for(i=q->head;i<q->tail;i++){
		printf("[%c] ",q->data[i]);
	}
	printf("\n");
}

void TestQueue(){
	TEST_HEADER;
	SeqQueue queue;
	SeqQueueInit(&queue);
	SeqQueuePush(&queue,'a');
	SeqQueuePush(&queue,'b');
	SeqQueuePush(&queue,'c');
	SeqQueuePush(&queue,'d');
	SeqQueuePrintChar(&queue ,"入队列四个元素");

	SeqQueuePop(&queue);
	SeqQueuePop(&queue);
	SeqQueuePrintChar(&queue,"出队列两个元素");
	SeqQueuePop(&queue);
	SeqQueuePop(&queue);
	SeqQueuePrintChar(&queue,"再出队列两个元素");

	SeqQueueType value;
	int ret = 0;
	ret = SeqQueueFront(&queue,&value);
	printf("ret expeted 1,actual %d\n",ret);
	printf("value expected a,actual %c\n",value);
}

int main(){
	TestQueue();
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序队列是一种线性结构,它具有先进先出的特点,也就是说,先进入队列的元素先出队列。在C语言中,我们可以使用数组来实现顺序队列。 下面是顺序队列基本操作实现: 1. 初始化队列 ```c #define MAXSIZE 100 // 定义队列最大长度 typedef struct { int data[MAXSIZE]; // 存储队列元素 int front; // 队首指针 int rear; // 队尾指针 } SqQueue; // 初始化队列 void InitQueue(SqQueue *Q) { Q->front = Q->rear = 0; } ``` 2. 判断队列是否为空 ```c // 判断队列是否为空 int IsEmpty(SqQueue Q) { if (Q.front == Q.rear) { return 1; // 队列为空 } else { return 0; // 队列不为空 } } ``` 3. 判断队列是否已满 ```c // 判断队列是否已满 int IsFull(SqQueue Q) { if ((Q.rear + 1) % MAXSIZE == Q.front) { return 1; // 队列已满 } else { return 0; // 队列未满 } } ``` 4. 入队操作 ```c // 入队操作 int EnQueue(SqQueue *Q, int x) { if (IsFull(*Q)) { return 0; // 队列已满,无法入队 } else { Q->data[Q->rear] = x; // 将元素 x 插入到队尾 Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针后移一位 return 1; // 入队成功 } } ``` 5. 出队操作 ```c // 出队操作 int DeQueue(SqQueue *Q, int *x) { if (IsEmpty(*Q)) { return 0; // 队列为空,无法出队 } else { *x = Q->data[Q->front]; // 将队首元素赋值给 x Q->front = (Q->front + 1) % MAXSIZE; // 队首指针后移一位 return 1; // 出队成功 } } ``` 以上就是顺序队列基本操作实现,你可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值