数据结构非循环队列-顺序存储

2022-08-14 10:39:27

队列概念

队列是对头出、队尾入的先进先出线性表。

需要两个指针front和rear分别来指向队头和队尾。

front指向队头元素的前一个位置,rear总是指向队尾元素。

进队:rear+1

出队:front+1

队空条件:front=rear

队满条件:rear = MaxSize - 1

 代码

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

#define ERROR 0
#define OK 1

#define ElemeType_SQu int //顺序栈数据类型

#define MaxSize_SQu 100 //顺序栈最大容量

typedef int status;

typedef struct {
	ElemeType_SQu data[MaxSize_SQu];
	int front;//队首
	int rear;//队尾
}QuType,*Queue;

void InitQueue_ln(Queue& qu)
{
	qu = (Queue)malloc(sizeof(QuType));
	if (!qu)exit(0);

	qu->front = -1;
	qu->rear = -1;
}

void DestoryQueue_ln(Queue& qu)
{
	free(qu);
}

status EnQueue_ln(Queue& qu, ElemeType_SQu e)
{
	if (qu->rear == MaxSize_SQu - 1)return ERROR;//如果当前队尾指针已经指向了最后一个元素位置,则队满

	qu->rear += 1;
	qu->data[qu->rear] = e;
	return OK;
}
status DeQueue_ln(Queue& qu, ElemeType_SQu& e)
{
	if (qu->front == qu->rear)return ERROR;//队空
	qu->front += 1;//只需要挪动队首就行了
	e = qu->data[qu->front];
	return OK;
}
bool QueueEmpty_ln(Queue& qu)
{
	return (qu->front == qu->rear);
}
int QueueCount_ln(Queue& qu)
{
	return (qu->rear - qu->front);
}


void QueueTest()
{
	ElemeType_SQu e;
	Queue qu;
	InitQueue_ln(qu);
	if (QueueEmpty_ln(qu)) printf("Empty\n"); else printf("not empty\n");
	EnQueue_ln(qu, 12);
	printf("%d\n", QueueCount_ln(qu));
	EnQueue_ln(qu, 23);
	EnQueue_ln(qu, 78);
	EnQueue_ln(qu, 102);
	EnQueue_ln(qu, 456);
	printf("%d\n", QueueCount_ln(qu));
	if (QueueEmpty_ln(qu)) printf("Empty\n"); else printf("not empty\n");
	DeQueue_ln(qu, e);
	printf("%d\n", e);
	DeQueue_ln(qu, e);
	printf("%d\n", e);
	DeQueue_ln(qu, e);
	printf("%d\n", e);
	DeQueue_ln(qu, e);
	printf("%d\n", e);
	DeQueue_ln(qu, e);
	printf("%d\n", e);
	if (QueueEmpty_ln(qu)) printf("Empty\n"); else printf("not empty\n");
}

int main()
{
	QueueTest();
	return 0;
}
  • 作者:BUG从入门到精通
  • 原文链接:https://blog.csdn.net/wei348144881/article/details/109642201
    更新时间:2022-08-14 10:39:27