数据结构
队列
队列和栈很相似,都是一种顺序表,链表;不过栈的特性为先进后出,而队列的特性为先进先出,且在生活中用处很多,比如说排号系统,银行的叫号系统都是用先进先出的特性完成的
顺序循环队列
一、定义顺序循环队列
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.判空
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;
}