queue 类实现
点击此处浏览C++官方的queue详细内容
主要功能有以下几个
函数 | 功能 |
---|---|
back | 返回对在 queue 后部最近添加的最后一个元素的引用 |
empty | 测试 queue 是否为空 |
front | 返回对 queue 前部的第一个元素的引用 |
pop | 从 queue 前端移除一个元素 |
push | 将元素添加到 queue 的后部 |
size | 返回 queue 中的元素数量 |
实现方法
方法一:
采用基于数组的方式来实现队列,为了合理利用所有空间,采用环形队列的方式进行实现,此处初始化时rear=0,front=1。
这里对为什么要多加一个空间做一下解释:首先对于队列中元素个数的计算方式为size = (rear+maxSize-front+1)%maxSize(简化起见,size = rear-front+1,其它计算方法实质都一样,取决于环形队列rear和front设计方式),假设我们需要一个能够存储n个元素的队列且只开辟一个大小为n的数组,那么size的所有可能取值为0,1,2,…,n,共有n+1种结果,而rear-front+1的值为0,1,n-1只能表示n种情况,所以需要多一个空间才能表示n+1种结果。
方法二
采用链表的方式,用front指向队列头结点,用rear指向队列尾结点,每添加一个元素就在链后加一个结点并将其设为rear,每删除一个元素就将front设置为原front的下一个结点,并将原front结点删除,和栈的实现较为类似。
自己实现queue类
方法一:
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Myqueue
{
private:
int front; //头元素下标
int rear; //尾元素下标
int maxSize; //队列总空间大小
T *array;
public:
Myqueue(int size = 10) //构造函数
{
front = 1;
rear = 0;
maxSize = size + 1;
array = new T[maxSize];
}
T back()
{
if (empty())
{
cout << "队列为空" << endl;
return NULL;
}
return array[rear];
}
bool empty()
{
if (size() == 0)
return true;
return false;
}
T frontValue()
{
if (empty())
{
cout << "队列为空" << endl;
return NULL;
}
else
{
return array[front];
}
}
void pop()
{
if (empty())
cout << "队列已经为空" << endl;
else
front = (front + 1) % maxSize;
}
void push(T value)
{
if (size() == maxSize - 1)
{
cout << "队列已满,无法继续添加元素" << endl;
}
else
{
rear = (rear + 1) % maxSize;
array[rear] = value;
}
}
int size()
{
return (rear + maxSize - front + 1) % maxSize;
}
};
int main()
{
Myqueue<string> q(5);
q.push("abc");
q.push("def");
q.push("ghi");
q.push("jkl");
q.push("mno");
q.push("pqr");
int len = q.size();
cout << q.back() << endl;
for (int i = 0; i < len; i++)
{
cout << q.frontValue() << endl;
q.pop();
}
cout << q.empty() << endl;
return 0;
}
方法二:
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Node
{
public:
T value;
Node *next;
Node(T value, Node* next = NULL)
{
this->value = value;
this->next = next;
}
};
template <typename T>
class Myqueue
{
private:
Node<T> *front;
Node<T> *rear;
int length;
public:
Myqueue()
{
front = rear = NULL;
length = 0;
}
T back()
{
if (empty())
{
cout << "队列为空" << endl;
return NULL;
}
return rear->value;
}
bool empty()
{
if (size() == 0)
return true;
return false;
}
T frontValue()
{
if (empty())
{
cout << "队列为空" << endl;
return NULL;
}
else
return front->value;
}
void pop()
{
if (empty())
cout << "队列已经为空" << endl;
else
{
Node<T> *temp = front;
front = front->next;
if (rear == temp)
rear = front;
delete (temp);
length--;
}
}
void push(T value)
{
length++;
if (length == 1)
{
front = new Node<T>(value, NULL);
rear = front;
}
else
{
rear->next = new Node<T>(value, NULL);
rear = rear->next;
}
}
int size()
{
return length;
}
};
int main()
{
Myqueue<string> q;
q.push("abc");
q.push("def");
q.push("ghi");
q.push("jkl");
q.push("mno");
q.push("pqr");
int len = q.size();
cout<<len<<endl;
cout << q.back() << endl;
for (int i = 0; i < len; i++)
{
cout << q.frontValue() << endl;
q.pop();
}
cout << q.empty() << endl;
return 0;
}