队列的链式存储—C++实现
队列的链式存储也类似于单链表,只不过要求:只能从队尾添加结点、队头删除结点。注意删除结点时要考虑只有一个结点与多个结点的情况!
头文件如下:
#pragma once
#include<iostream>
using namespace std;
class QueueNode
{
public:
int data;//数据域
QueueNode* next;//指针域,指向队列中下一个结点
};
class QueueList
{
public:
QueueList();
~QueueList();
void Push(int data);//入队:只能从队尾
int Pop();//出队,只能从队头
void Show();//遍历输出队列元素
bool Isempty();//判断队列是否为空
int Getsize();//获取队列长度
private:
QueueNode* front;//头指针
QueueNode* rear;//尾指针
int size;//队列长度
};
具体实现如下:
#include<iostream>
#include"Queue的链式存储.h"
using namespace std;
QueueList::QueueList()
{
front=new QueueNode;//头结点
rear = front;
size = 0;
}
QueueList::~QueueList()
{
delete front;
front = NULL;
}
void QueueList::Push(int data)//入队:只能从队尾
{
QueueNode* p = new QueueNode;
p->data = data;
p->next = NULL;
rear->next = p;
rear = p;//让rear重新指向队尾
size++;
}
int QueueList::Pop()//出队:只能从队头(这里就分两种情况了)
{
if (Isempty())
{
cout << "空队列,没有结点可以出" << endl;
return -1;
}
QueueNode* p = front->next;//让p指向队列中的第一个结点
int e = p->data;
front->next = p->next; //①队列有不止一个结点
if (p == rear)//②队列只有一个结点
{
rear = front;
}
size--;
return e;
}
void QueueList::Show()//遍历输出队列元素
{
QueueNode* p = front->next;
if (Isempty())
cout << "空队列,没有结点可以遍历" << endl;
else {
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
}
bool QueueList::Isempty()//判断队列是否为空
{
if (size == 0)
return true;
else return false;
}
int QueueList::Getsize()//获取队列长度
{
return size;
}
int main()
{
QueueList ql;
ql.Push(1998);
ql.Push(1997);
ql.Push(1996);
ql.Show();
int temp = ql.Pop();
cout << "被删除的队头元素为:" << temp << endl;
ql.Show();
bool ret = ql.Isempty();
if (ret)
cout << "空队列" << endl;
else
cout << "非空队列" << endl;
int size = ql.Getsize();
cout << "队列的长度为:" << size << endl;
}
输出如下:
只添加一个结点的输出如下: