数据结构(顺序循环队列)

数据结构

队列
队列和栈很相似,都是一种顺序表,链表;不过栈的特性为先进后出,而队列的特性为先进先出,且在生活中用处很多,比如说排号系统,银行的叫号系统都是用先进先出的特性完成的

顺序循环队列

一、定义顺序循环队列

Ps:用顺序表来实现顺序循环队列

typedef int ElemType;

#define SIZE 10

typedef struct SCQueue               //定义队列
{
	ElemType *data;
	int head;
	int tail;
	int size;
}*SCQueuePtr;

二、顺序循环队列所实现的功能
1.顺序循环队列初始化

int Init_Queue(SCQueuePtr list)
{
	list->data = (ElemType*)malloc(sizeof(ElemType)*SIZE);
	assert(list->data!=NULL);
	if(list->data == NULL) exit(0);
	list->head = list->tail = 0;
	list->size = SIZE;
	return true;
}

2.入队列

int Push_Queue(SCQueuePtr list,ElemType val)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	if(Full_Queue(list)&&!Apply_Queue(list))
	{
		return false;
	}
	list->data[list->tail] = val;
	list->tail = (list->tail+1)%list->size;
	return true;
}

3.出队列

int Pop_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list==NULL)  exit(0);
	list->head = (list->head+1)%list->size;
	return true;
}

4.获得队列元素

ElemType GetHead_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	return list->data[list->head];
}

5.申请新空间

static int Apply_Queue(SCQueuePtr list)
{
	ElemType *s = (ElemType*)malloc(sizeof(ElemType)*list->size*2);
	assert(s!=NULL);
	if(s==NULL)  return false;
	int j = 0;
	for(int i=list->head;i != list->tail;i=(i+1)%list->size,j++)
	{
		s[j] = list->data[i];
	}
	free(list->data);
	list->data = s;
	s = NULL;
	list->head = 0;
	list->tail = j+1;
	list->size*=2;
	return true;
}

6.清空顺序循环队列

int Clear_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	list->head = list->tail = 0;
	return true;
}

7.销毁顺序循环队列

int Destroy_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	free(list->data);
	list->data = NULL;
	list->head = list->tail = 0;
	list->size = 0;
	return true;
}

8.判空

扫描二维码关注公众号,回复: 8568496 查看本文章
int Empty_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	if(list->head == list->tail)
	{
		return true;
	}
	return false;
}

9.判满

static int Full_Queue(SCQueuePtr list)
{
	if((list->tail+1)%list->size == list->head)
	{
		return true;
	}
	return false;
}

总代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int ElemType;

#define SIZE 10

typedef struct SCQueue               //定义队列
{
	ElemType *data;
	int head;
	int tail;
	int size;
}*SCQueuePtr;

static int Apply_Queue(SCQueuePtr list)
{
	ElemType *s = (ElemType*)malloc(sizeof(ElemType)*list->size*2);
	assert(s!=NULL);
	if(s==NULL)  return false;
	int j = 0;
	for(int i=list->head;i != list->tail;i=(i+1)%list->size,j++)
	{
		s[j] = list->data[i];
	}
	free(list->data);
	list->data = s;
	s = NULL;
	list->head = 0;
	list->tail = j+1;
	list->size*=2;
	return true;
}

static int Full_Queue(SCQueuePtr list)
{
	if((list->tail+1)%list->size == list->head)
	{
		return true;
	}
	return false;
}


int Empty_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	if(list->head == list->tail)
	{
		return true;
	}
	return false;
}

int Init_Queue(SCQueuePtr list)
{
	list->data = (ElemType*)malloc(sizeof(ElemType)*SIZE);
	assert(list->data!=NULL);
	if(list->data == NULL) exit(0);
	list->head = list->tail = 0;
	list->size = SIZE;
	return true;
}

int Push_Queue(SCQueuePtr list,ElemType val)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	if(Full_Queue(list)&&!Apply_Queue(list))
	{
		return false;
	}
	list->data[list->tail] = val;
	list->tail = (list->tail+1)%list->size;
	return true;
}

int Pop_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list==NULL)  exit(0);
	list->head = (list->head+1)%list->size;
	return true;
}

ElemType GetHead_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	return list->data[list->head];
}

int Clear_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	list->head = list->tail = 0;
	return true;
}

int Destroy_Queue(SCQueuePtr list)
{
	assert(list!=NULL);
	if(list == NULL)  exit(0);
	free(list->data);
	list->data = NULL;
	list->head = list->tail = 0;
	list->size = 0;
	return true;
}

int main()
{
	//以下为测试内容--------------------
	SCQueue list;
	Init_Queue(&list);
	if(Empty_Queue(&list))
	{
		printf("Empty Queue\n");
	}
	for(int i=0;i<9;i++)
	{
		Push_Queue(&list,i);
	}
	printf("%d  ",GetHead_Queue(&list));
	Pop_Queue(&list);
	printf("%d  ",GetHead_Queue(&list));
	Pop_Queue(&list);
	printf("%d  ",GetHead_Queue(&list));
	Pop_Queue(&list);
	printf("%d  ",GetHead_Queue(&list));
	Pop_Queue(&list);
	printf("%d  \n",GetHead_Queue(&list));
	Pop_Queue(&list);
	Clear_Queue(&list);
	if(Empty_Queue(&list))
	{
		printf("Empty Queue\n");
	}
	Destroy_Queue(&list);
	return 0;
}
发布了18 篇原创文章 · 获赞 0 · 访问量 679

猜你喜欢

转载自blog.csdn.net/wfea_lff/article/details/103424843