C数据结构与算法-基础整理-栈和队列-02:队列的基础操作

0x01.关于队列

队列是一种先进先出的数据结构,有入队(EnQueue)和出队(DeQueue)操作。因为数据的存放取出存在优先级的,所有广泛用于各种算法。

队列同样要注意队头指针和队尾指针。

关于循环队列,主要要知道判满与计算长度的数学思想。

0x02.基础数组队列

#define SIZE 50

typedef struct
{
	int data[SIZE];
	int head;
	int tail;
}QUEUE;

QUEUE Q;
void iniqueue()
{
	Q.head = 0;
	Q.tail = 0;
	return;
}
void EnQueue(int m)
{
	if (Q.tail >= SIZE)
	{
		printf("队列已满,无法加入元素!!!");
		return;
	}
	Q.data[Q.tail++] = m;
	return;
}
void DeQueue()
{
	if (Q.tail == Q.head)
	{
		printf("队列为空,无法取出元素!!!");
		return;
	}
	int m = Q.data[Q.head++];
	printf("队列头元素 %d 已取出!!!\n", m);
	return;
}

0x03.循环队列

由来:普通的队列用着用着,很多的空间就被浪费掉了,循环队列使得队尾可以不断的循环移动,充分利用了空间。

#define SIZE 50

typedef struct
{
	int data[SIZE];
	int head;
	int tail;
}QUEUE;

QUEUE Q;
void iniqueue()
{
	Q.head = Q.tail = 0;
}
int isfull()
{
	if (Q.head == (Q.tail + 1) % SIZE)
	{
		return 1;
	}
	return 0;
}
int isempty()
{
	if (Q.head == Q.tail)
	{
		return 1;
	}
	return 0;
}
void en(int m)
{
	if (isfull())
	{
		printf("循环队列已满,无法进行 入队 操作!!!");
		return;
	}
	Q.data[Q.tail] = m;
	Q.tail = (Q.tail + 1) % SIZE;
	return;
}
void de()
{
	if (isempty())
	{
		printf("循环队列为空,无法进行 出队 操作!!!");
	}
	int m = Q.data[Q.head];
	Q.head = (Q.head + 1) % SIZE;
	return;
}
void length()
{
	int m = (Q.tail + SIZE - Q.head) % SIZE;
	printf("队列的有效长度是 %d \n",m);
}

0x04.链表队列

typedef struct LINK
{
	int data;
	struct LINK* next;
}LINK;

typedef struct QUEUE
{
	struct LINK* head;
	struct LINK* tail;
	int size;
};

QUEUE* Q=NULL;
void iniqueue()
{
	Q = (QUEUE*)malloc(sizeof(QUEUE));
	Q->head = Q->tail = (LINK*)malloc(sizeof(LINK));
	Q->head->next = Q->tail->next = NULL;
	Q->size = 0;
}
void en(int m)
{
	LINK *pnew= (LINK*)malloc(sizeof(LINK));
	pnew->data = m;
	pnew->next = NULL;
	Q->size++;
	Q->tail->next = pnew;
	Q->tail = pnew;
}
void de()
{
	if (Q->size == 0)
	{
		printf("链表队列为空,无法进行 出队 操作!!!");
		return;
	}
	LINK* tmp = Q->head->next;
	Q->head->next = tmp->next;
	free(tmp);
	return;
}
发布了50 篇原创文章 · 获赞 35 · 访问量 1282

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/104476763