个人学习笔记。
个人理解数据结构只是个概念,怎么实现完全看个人和项目 需求,可以用偏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;
}
}