# 顺序队列的基本原理

在数据类型中,队列与栈是极为相似的,
另外,队列在线性表的范畴之内,但在基本的实现方面却受到限制。
对于顺序队列来说,
顺序队列与顺序栈的基本原则恰恰相反,
顺序队列应满足`先入先出``后入后出`的原则,
此外,通过顺序表实现的顺序队列,
倘若想加入队列只能在队尾加入,
倘如想退出队列只能在队头退出。

# 顺序队列的基本创建

SeqQueues_.h(头文件)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define MAX_SPACE 8
typedef int Element;
struct SeqQueues_Pointer
{
	Element* element;
	int head;
	int tail;
};
void Init_Queues(struct SeqQueues_Pointer* SQ_P);
void Show_Menu();
void Join_Queues(struct SeqQueues_Pointer* SQ_P, Element element);
void Out_Queues(struct SeqQueues_Pointer* SQ_P);
void Show_Queues(struct SeqQueues_Pointer* SQ_P);
int get_length(struct SeqQueues_Pointer* SQ_P);
void Clean_Queues(struct SeqQueues_Pointer* SQ_P);
void destroy_Space(struct SeqQueues_Pointer* SQ_P);
SeqQueues_functions.c
#include"SeqQueues_.h"
void Init_Queues(struct SeqQueues_Pointer* SQ_P)
{
	SQ_P->element = (Element*)malloc(sizeof(int) * MAX_SPACE);
	SQ_P->head = -1;
	SQ_P->tail = -1;
}
void Show_Menu()
{
	printf("\n********************************************\n");
	printf(" [1]Join_Queues ***********[2]Out_Queues   *\n");
	printf(" [3]Show_Queues ***********[4]get_length   *\n");
	printf(" [5]Clean_Queues***********[6]destroy_Space*\n");
	printf(" [0]Exit_system ***********                *");
	printf("\n********************************************\n");
}
void Join_Queues(struct SeqQueues_Pointer* SQ_P, Element element)
{
	assert(NULL != SQ_P->element);
	if (SQ_P->tail < MAX_SPACE - 1)
	{
		SQ_P->element[++SQ_P->tail] = element;
		printf("%d入队\n", SQ_P->element[SQ_P->tail]);
		if (!(SQ_P->tail))
			SQ_P->head = SQ_P->tail;
	}
}
void Out_Queues(struct SeqQueues_Pointer* SQ_P)
{
	assert(NULL != SQ_P->element);
	if (SQ_P->head <= SQ_P->tail)
	{
		printf("%d出队\n", SQ_P->element[SQ_P->head]);
		SQ_P->head++;
	}
}
void Show_Queues(struct SeqQueues_Pointer* SQ_P)
{
	int i = 0;
	for (i = SQ_P->head; i < SQ_P->tail + 1; i++)
		printf("%d ", SQ_P->element[i]);
}
int get_length(struct SeqQueues_Pointer* SQ_P)
{
	printf("当前空间长度为%d\n", SQ_P->tail - SQ_P->head + 1);
	return SQ_P->tail - SQ_P->head + 1;
}
void Clean_Queues(struct SeqQueues_Pointer* SQ_P)
{
	assert(NULL != SQ_P->element);
	SQ_P->head = -1;
	SQ_P->tail = -1;
}
void destroy_Space(struct SeqQueues_Pointer* SQ_P)
{
	assert(NULL != SQ_P->element);
	free(SQ_P->element);
	SQ_P->element = NULL;
}
SeqQueues_main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqQueues_.h"
int main()
{
	int option = 0;
	int element = 0;
	struct SeqQueues_Pointer SQ_P;
	Init_Queues(&SQ_P);
	Show_Menu();
	while (printf("\n选择为>"), scanf("%d", &option), option)
	{
		switch (option)
		{
		case 1:
			printf("入队值为(-1终止)>");
			while (scanf("%d", &element), -1 != element)
			{
				Join_Queues(&SQ_P,element);
			}
			break;
		case 2:
			Out_Queues(&SQ_P);
			break;
		case 3:
			Show_Queues(&SQ_P);
			break;
		case 4:
			get_length(&SQ_P);
			break;
		case 5:
			Clean_Queues(&SQ_P);
			break;
		case 6:
			destroy_Space(&SQ_P);
			break;
		default: printf("超出选择范围\n");
		}
		Show_Menu();
	}
	destroy_Space(&SQ_P);
	return 0;
}