数据结构笔记(四)——队列(queue)

个人学习笔记。

个人理解数据结构只是个概念,怎么实现完全看个人和项目 需求,可以用偏C语言的方式实现,也可以用C++中更偏向于类的方式,加上构造函数和析构函数等。看这些代码,和正常看C/C++代码一样看。因为之前有人问我一些问题,随便叨叨。

队列同样算是表,它的特点是先进先出(FIFO)。

一、数组实现队列

这里用循环数组,队首留一个位置不存数据。

QueueArray.h

#pragma once
#include <iostream>
using namespace std;
struct QueueRecord;
typedef QueueRecord *Queue;
typedef int ElementType;
#define MAXSIZXE 20
Queue creatQueue();
bool isEmpty(Queue);
void makeEmpty(Queue);
void enqueue(ElementType,Queue);
ElementType dequeue(Queue);
void printQueue(Queue);
void disposeQueue(Queue);
struct QueueRecord 
{
	ElementType *data;
	unsigned int size;
	unsigned int front;
	unsigned int rear;
};

QueueArray.cpp

#include "stdafx.h"
#include "QueueArray.h"
Queue creatQueue()
{
	Queue q = (Queue)malloc(sizeof(QueueRecord));
	if (q==nullptr)
	{
		return nullptr;
	}
	q->data = (ElementType*)malloc(sizeof(ElementType)*MAXSIZXE);
	if (q->data == nullptr)
	{
		return nullptr;
	}
	q->front = 0;
	q->rear = q->front;
	q->size = 0;
	return q;
}
bool isEmpty(Queue q)
{
	if (q->size==0)
	{
		return true;
	}
	return false;
}
void makeEmpty(Queue q)
{
	q->front = 0;
	q->rear = q->front;
	q->size = 0;
}
void enqueue(ElementType e, Queue q)
{
	if (q->size==MAXSIZXE-1)
	{
		return;
	}
	if ((q->rear+1)%MAXSIZXE==0)
	{
		q->rear = 0;
	}
	else
	{
		++q->rear;
	}
	q->data[q->rear] = e;
	++q->size;
}
ElementType dequeue(Queue q)
{
	if (isEmpty(q))
	{
		return 0;
	}
	--q->size;
	ElementType res = q->data[q->front+1];
	if ((q->front+1)%MAXSIZXE==0)
	{
		q->front = 0;
	}
	else
	{
		++q->front;
	}
	return res;
}
void printQueue(Queue q)
{
	if (isEmpty(q))
	{
		return;
	}
	unsigned p = q->front+1;
	for (unsigned i=0;i<q->size;++i)
	{
		cout << q->data[p] << endl;
		if ((p+1)%MAXSIZXE==0)
		{
			p = 0;
		}
		else
		{
			++p;
		}
	}
}
void disposeQueue(Queue q)
{
	if (q!=nullptr)
	{
		free(q->data);
		q->data = nullptr;
		free(q);
		q = nullptr;
	}
	
}

二、链表实现队列

这里有一个Node结构体,队列由node组成,数据存在node中,在队列的结构体中只含两个指针表示队列首尾。同样注意内存泄漏,要在最后把申请的内存free掉。

QueueList.h

#pragma once
#include<iostream>
using namespace std;
#define MAXSIZXE 20
typedef int ElementType;
struct Node;
struct QueueRecord;
typedef Node *PtrNode;
typedef QueueRecord *Queue;
Queue creatQueue();
bool isEmpty(Queue);
void makeEmpty(Queue);
void enqueue(ElementType, Queue);
ElementType dequeue(Queue);
void disposeQueue(Queue);
void printQueue(Queue);
struct Node 
{
	ElementType data;
	PtrNode next;
};
struct QueueRecord 
{
	PtrNode front;
	PtrNode rear;
};

QueueList.cpp

#include "stdafx.h"
#include "QueueList.h"
Queue creatQueue()
{
	Queue q = (Queue)malloc(sizeof(QueueRecord));
	if (q==nullptr)
	{
		return nullptr;
	}
	q->front = (PtrNode)malloc(sizeof(Node));
	if (q->front==nullptr)
	{
		return nullptr;
	}
	q->rear = q->front;
	q->rear->next = nullptr;
	return q;
}
bool isEmpty(Queue q)
{
	if (q->front==q->rear)
	{
		return true;
	}
	return false;
}
void makeEmpty(Queue q)
{
	while (!isEmpty(q))
	{
		dequeue(q);
	}
}
void enqueue(ElementType e, Queue q)
{
	PtrNode node = (PtrNode)malloc(sizeof(Node));
	node->data = e;
	node->next = nullptr;
	q->rear->next = node;
	q->rear = node;
}
ElementType dequeue(Queue q)
{
	if (isEmpty(q))
	{
		return 0;
	}
	PtrNode ptr = q->front;
	ElementType res = ptr->next->data;
	q->front = q->front->next;
	free(ptr);
	return res;
}
void disposeQueue(Queue q)
{
	makeEmpty(q);
	free(q->front);
	q->front = nullptr;
	q->rear = nullptr;
	free(q);
}
void printQueue(Queue q)
{
	PtrNode ptr = q->front;
	while (ptr!=q->rear)
	{
		cout <<ptr->next->data << endl;
		ptr = ptr->next;
	}
}

猜你喜欢

转载自blog.csdn.net/xitie8523/article/details/88816835