链队列
关于此数据结构&题外话
链队列是队列的一种,队列(Queue)是一种先入先出的数据结构。增加元素叫入队,删除元素叫出队。
我最近发现了拿类组织数据结构真的是一件很方便的事,因此这一期用的事模板+类,有关C++的代码我都会在旁标出C语言等价解释。
链队列的示意

可以看到,在入队时,将元素加入队尾。而在出队时,只需将队首元素出队就行了。但是为了防止内存泄漏就应释放出队的那一个元素。
一种特殊情况是,在队列里只有一个元素时,将该元素出队。此时就需要移动rear, 使rear = front,否则之后在判空时会出错。如图所示

链队列应实现的功能如下
template <typename ElementType>
class LinkQueue
{
private:
Node<ElementType> *front; //相当于Node的数据域类型为ElementType
Node<ElementType> *rear;
public:
bool initQueue(); //初始化队列
bool isEmpty(); //队列判空
bool enterQueue(ElementType x); //入队
bool deleteQueue(ElementType *x); //出队
bool getHead(ElementType *x); //得到元素,但不出队
void clearQueue(); //清空队列
};
链队列的实现
注释都在代码里,不懂请发私信或直接联系我QQ也行。
#include <iostream>
template <typename ElementType> //相当于#define ElementType 元素类型
struct Node
{
ElementType data; //数据域
Node *next; //指针域
};
template <typename ElementType>
class LinkQueue
{
private:
Node<ElementType> *front; //相当于Node的数据域类型为ElementType
Node<ElementType> *rear;
public:
bool initQueue(); //初始化队列
bool isEmpty(); //队列判空
bool enterQueue(ElementType x); //入队
bool deleteQueue(ElementType *x); //出队
bool getHead(ElementType *x); //得到元素,但不出队
void clearQueue(); //清空队列
};
template <typename ElementType>
bool LinkQueue<ElementType>::initQueue()
{
try //相当于front = (Node*)malloc(sizeof(Node))
{
front = new Node<ElementType>;
}
catch (const std::exception &e)
{ //相当于if(front == NULL)
std::cerr << e.what() << '\n';
}
rear = front;
front->next = nullptr;
return true;
}
template <typename ElementType>
bool LinkQueue<ElementType>::isEmpty()
{
if (front == rear)
{
return true;
}
return false;
}
template <typename ElementType>
bool LinkQueue<ElementType>::enterQueue(ElementType x)
{
Node<ElementType> *newNode;
try
{
newNode = new Node<ElementType>;
}
catch (const std::exception &e)
{
std::cerr << e.what() << '\n';
}
newNode->data = x;
newNode->next = nullptr;
rear->next = newNode;
rear = newNode;
return true;
}
template <typename ElementType>
bool LinkQueue<ElementType>::deleteQueue(ElementType *x)
{
Node<ElementType> *p;
if (this->isEmpty()) //队空
{
return false;
}
p = front->next;
*x = p->data;
front->next = p->next;
if (rear == p) //如果队中只有一个元素p,则p出队后成为空队
{
rear = front;
}
delete p;
return true;
}
template <typename ElementType>
bool LinkQueue<ElementType>::getHead(ElementType *x)
{
if (this->isEmpty())
{
return false;
}
*x = front->next->data;
return true;
}
template <typename ElementType>
void LinkQueue<ElementType>::clearQueue()
{
if (this->isEmpty())
{
return;
}
while (front != rear)
{
Node<ElementType> *p = front;
front = front->next;
delete p;
}
}
int main()
{ //测试代码
LinkQueue<int> test;
test.initQueue();
int testInt;
test.enterQueue(1);
test.enterQueue(2);
test.enterQueue(3);
test.getHead(&testInt);
std::cout << testInt << std::endl;
test.deleteQueue(&testInt);
std::cout << testInt << std::endl;
test.deleteQueue(&testInt);
std::cout << testInt << std::endl;
test.clearQueue();
test.deleteQueue(&testInt);
std::cout << testInt << std::endl;
}

浙公网安备 33010602011771号