【队列上(顺序队列)】

本文介绍了队列的基本概念,特别是顺序队列的实现方式。使用typedef和结构体定义了顺序队列的数据结构,并通过front和rear指针管理队头和队尾。文章详细展示了如何进行队列的创建、入队、出队、判断队列空和满等操作,以及如何处理循环队列以避免数组越界问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一.队列定义

 二.顺序队列

1.代码定义

2.规定说明

3.操作顺序队列实现


一.队列定义

队列是限制在两端进行插入操作和删除操作的线性表

1.允许进行存入操作的一端称为“队尾”

允许进行删除操作的一端称为“队头”

当线性表中没有元素时,称为“空队”

2.特点 :先进先出(FIFO)

跟现实中排队是一样的

3.队列的应用

5.队列的操作包括

创建队列 :CreateQueue ()

清空队列 :ClearQueue (Q)

判断队列空 :EmptyQueue(Q)

判断队列满 :FullQueue(Q)

入队 :EnQueue (Q , x)

出队 :DeQueue(Q)

 二.顺序队列

1.代码定义

typedef  int  data_t ;    /*定义队列中数据元素的数据类型*/
#define  N  64	    /*定义队列的容量*/
typedef  struct 
{
      data_t  data[N] ;   /*用数组作为队列的储存空间*/
      int  front, rear ;     /*指示队头位置和队尾位置*/
} sequeue_t ; 	     /*顺序队列类型定义*/

2.规定说明

front指向队头元素的位置; rear指向队尾元素的下一个位置。

其实rear是存新值的位置

在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。

设两个指针front,rear,约定:

Q.rear指示队尾元素的下一个位置;

Q.front指示队头元素 初值Q.front=Q.rear=0

为区别空队和满队,满队元素个数比数组元素个数少一个。

 从0-5依次入队

3.操作顺序队列实现

(1)为了实现循环的效果,要让rear+1取余,这样就可以把rear限制在0-某个数之间,虽然rear一直在加但是余数限制在一个范围内了,同理对front操作加一,都必须是以+1后取余的操作

(2)判断队列是否满的时候,要注意留一个空位置出来

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sequeue.h"

sequeue * queue_create() 
{
	sequeue *sq;

	if ((sq = (sequeue *)malloc(sizeof(sequeue))) == NULL) 
{
		printf("malloc failed\n");
		return NULL;
	}

	memset(sq->data, 0, sizeof(sq->data));
	sq->front = sq->rear = 0;
	return sq;
}

int enqueue(sequeue *sq, datatype x) 
{
	if (sq == NULL) 
{
		printf("sq is NULL\n");
		return -1;
	}

	if ((sq->rear + 1) % N == sq->front) 
  {
		printf("sequeue is full\n");
		return -1;
	}

	sq->data[sq->rear] = x;
	sq->rear = (sq->rear + 1) % N;

	return  0;
}

datatype dequeue(sequeue *sq) 
{
	datatype ret;

	ret = sq->data[sq->front];

	sq->front = (sq->front + 1) % N;

	return ret;
}

int queue_empty(sequeue *sq) 
{
	if (sq == NULL)
 {
		printf("sq is NULL\n");
		return -1;
	}

	return (sq->front == sq->rear ? 1 : 0);
}

int queue_full(sequeue *sq) 
{
	if (sq == NULL) 
{
		printf("sq is NULL\n");
		return -1;
	}

	if ((sq->rear + 1) % N == sq->front)
 {
		return 1;
	}
	else {
		return 0;
	}
}

int queue_clear(sequeue *sq) 
{
	if (sq == NULL)
 {
		printf("sq is NULL\n");
		return -1;
	}

	sq->front = sq->rear = 0;

	return 0;
}

sequeue * queue_free(sequeue *sq)
 {
	if (sq == NULL)
 {
		printf("sq is NULL\n");
		return NULL;
	}

	free(sq);
	sq = NULL;

	return NULL;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

放牛的守护神_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值