数据结构——队列(1)

定义

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

  • 对尾:允许进行存入操作的一端
  • 对头:允许进行删除操作的一端
  • 空队:当线性表当中没有元素时
  • 特点:先进先出(FIFO)
  • 双端队列:两端多可以入队出队

顺序队列(循环队列)

  • front:指向对头元素的位置
  • rear;指向对尾元素的下一个位置
  • 空队:front = rear = 0
  • 满队:(sq->rear + 1) % N == sq->front(满队元素个数要比这个的数组数组空间少1)
  • 实现循环队列:取余

头文件:sequeue.h

typedef int datatype;

#define N 128

typedef struct _stSequeue{
	datatype data[N];
	int front;
	int rear;
}stSequeue;

stSequeue *QueueCreate();
int EnQueue(stSequeue *sq, datatype x);
datatype DeQueue(stSequeue *sq);
int EmptyQueue(stSequeue *sq);
int FullQueue(stSequeue *sq);
int ClearQueue(stSequeue *sq);
stSequeue* FreeSqueue(stSequeue *sq);

队列.文件:sequeue.c

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

stSequeue *QueueCreate(){
	stSequeue *sq = (stSequeue *)malloc(sizeof(stSequeue));
	if(sq == NULL){
		printf("malloc failed!\n");
		return NULL;
	}
	memset(sq->data,0,sizeof(sq->data));
	sq->front = sq->rear = 0;
	return sq;
}
int EnQueue(stSequeue *sq, datatype x){	
	if(sq == NULL){
		printf("sp is NULL\n");
		return -1;
	}
	if((sq->rear + 1) % N == sq->front){
		printf("sequeue if full\n");
		return -1;
	}

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

	return 0;
}
datatype DeQueue(stSequeue *sq){
	if(sq == NULL){
		printf("sq is NULL\n");
		return -1;
	}
	
	datatype temp;

	temp = sq->data[sq->front];
	sq->front = (sq->front + 1) % N;

	return temp;
}
int EmptyQueue(stSequeue *sq){
	if(sq == NULL){
		printf("sq is NULL\n");
		return -1;
	}
	if(sq->rear == sq->front){
		printf("sequeue if empty\n");
		return 1;
	}
	return 0;
}
int FullQueue(stSequeue *sq){	
	if(sq == NULL){
		printf("sq is NULL\n");
		return -1;
	}
	if((sq->rear + 1) % N == sq->front){
		printf("sequeue if full\n");
		return 1;
	}
	return 0;
}
int ClearQueue(stSequeue *sq){
	if(sq == NULL){
		printf("sq is NULL\n");
		return -1;
	}
	memset(sq->data,0,sizeof(sq->data));
	sq->front = sq->rear = 0;

	return 0;
}
stSequeue* FreeSqueue(stSequeue *sq){
	if(sq == NULL){
		printf("sq is NULL\n");
		return NULL;
	}
	free(sq);
	sq = NULL;
	return NULL;
}

主函数:

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

int main(){

	stSequeue *sq;
	sq = QueueCreate();
	if(sq == NULL){
		printf("sq is NULL\n");
	}
	
	EnQueue(sq,10);
	EnQueue(sq,100);
	EnQueue(sq,1000);
	EnQueue(sq,10000);

	while(!EmptyQueue(sq)){
		printf("datatype:%d\n",DeQueue(sq));
	}

	sq = FreeSqueue(sq);

	printf("start:\n");
	return 0;
}

结果:
在这里插入图片描述

题目

1、顺序队列为什么要采用循环的方式?

随着队列元素不断地入队出队,如果队头一直不前移一定会出现队头队尾指向同一位置,那样我们的队列就消失了,当然可以采用队列元素出队列后,剩余元素前移一个位置,但是这样的操作增加了代码冗余和时间复杂度,所以顺序队列采用循环的方式。

2、循环队列如何判断空和满?

满队元素个数比整个队列的存储空间数目少1,空队的头和为指针指向同一个数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

li星野

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

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

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

打赏作者

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

抵扣说明:

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

余额充值