1 特点
队列的数据结构为线性结构
队列只能在一端完成插入,在另一端完成删除。先进先出(FIFO),生活中的例子有买票排队、打印机的打印队列
2 包含的操作
- 入队列
- 出队列
3 实现方式
基于数组实现
4 队列与循环队列
4.1 队列
编程时主要考虑的是指针移动操作和数据操作的顺序,以及空间是否为满/空(相应的,不能入/出队列)
存在的缺点是空间越用越少
MyQueue.h
#include <iostream>
const int N = 10; // 数组大小
template <typename T>
class MyQueue
{
public:
MyQueue();
~MyQueue();
void enqueue(T);
T dequeue();
void show_array();
private:
int _front;
int _back;
T _array[N] = {0}; // 数据存放在数组中
bool _isEmpty();
bool _isFull();
protected:
};
MyQueue.cpp
#include "MyQueue.h"
/*
* 将表头和尾部初始化为0
*/
template <typename T>
MyQueue<T>::MyQueue()
{
_front = _back = 0;
}
/*
* 析构函数
*/
template <typename T>
MyQueue<T>::~MyQueue()
{
}
/*
* 判断队列是否为空
*/
template <typename T>
bool MyQueue<T>::_isEmpty()
{
if(_back == _front)
return true;
else if(_back > _front)
return false;
else
{
std::cout << "someting wrong with the space" << std::endl;
return true;
}
}
/*
* 判断队列是否为满
*/
template <typename T>
bool MyQueue<T>::_isFull()
{
if(_back == N)
return true;
else if(_back < N)
return false;
else
{
std::cout << "someting wrong with the space" << std::endl;
return true;
}
}
/*
* 入队列
*/
template <typename T>
void MyQueue<T>::enqueue(T data)
{
if(_isFull())
std::cout << "the space is full, failed to enquence" << std::endl;
else
_array[_back++] = data;
}
/*
* 出队列
*/
template <typename T>
T MyQueue<T>::dequeue()
{
if(_isEmpty())
{
std::cout << "the space is empty, failed to dequence" << std::endl;
return -999;
}
else
return _array[_front++];
}
/*
* 测试程序,显示数组信息
*/
template <typename T>
void MyQueue<T>::show_array()
{
std::cout << "the elements are: ";
for(int i = 0; i < N; i++)
{
std::cout << _array[i] << '\t';
}
std::cout << std::endl
<< "the variable _front is: " << _front << std::endl
<< "the variable _back is: " << _back << std::endl;
}
template class MyQueue<int>;
template class MyQueue<float>;
template class MyQueue<double>;
main.cpp
#include <iostream>
#include "MyQueue.h"
int main()
{
MyQueue<int> queue1;
int num;
for(int i = 0; i < N + 1; i++)
{
std::cout << "enquence a integrate number:" << std::endl;
std::cin >> num;
queue1.enqueue(num);
}
for(int i = 0; i < N + 1; i++)
std::cout << "dequence a number, the number is: " << queue1.dequeue() << std::endl;
queue1.show_array();
return 0;
}
运行结果:
这里把入队列和出队列的英文写错了,抱歉
4.2 循环队列
解决了上述队列空间越用越少的问题
front==back时作为队列为空处理,这样的话size=(back-front+N)%N == N-1时,队列就被认为是满的,但是此时元素array[back]的空间未被使用,也就是说大小为N的数组最多存放N-1个元素
MyQueue.h
#include <iostream>
const int N = 10; // 数组大小
template <typename T>
class MyQueue
{
public:
MyQueue();
~MyQueue();
bool isEmpty();
bool isFull();
void enqueue(T);
T dequeue();
void show_array();
private:
int _front;
int _back;
T _array[N] = {0}; // 数据存放在数组中
protected:
};
MyQueue.cpp
#include "MyQueue.h"
/*
* 将表头和尾部初始化为0
*/
template <typename T>
MyQueue<T>::MyQueue()
{
_front = _back = 0;
}
/*
* 析构函数
*/
template <typename T>
MyQueue<T>::~MyQueue()
{
}
/*
* 判断队列是否为空
*/
template <typename T>
bool MyQueue<T>::isEmpty()
{
if((_back-_front+N)%N == 0)
return true;
else
return false;
}
/*
* 判断队列是否为满
* 如果_back==N-1,_front==0,则判断为满
* 虽然此时还有一个空间,但是不能再入队列,否则不能区分该队列是满还是空
*/
template <typename T>
bool MyQueue<T>::isFull()
{
if((_back-_front+N)%N == N-1)
return true;
else
return false;
}
/*
* 入队列
*/
template <typename T>
void MyQueue<T>::enqueue(T data)
{
if(isFull())
{
std::cout << "the space is full, failed to enquence" << std::endl;
}
else
{
if(_back == N)
_back = 0;
_array[_back++] = data;
}
}
/*
* 出队列
*/
template <typename T>
T MyQueue<T>::dequeue()
{
if(isEmpty())
{
std::cout << "the space is empty, failed to dequence" << std::endl;
return -999;
}
else
{
if(_front == N)
_front = 0;
return _array[_front++];
}
}
/*
* 测试程序,显示数组信息
*/
template <typename T>
void MyQueue<T>::show_array()
{
std::cout << "the elements are: ";
for(int i = 0; i < N; i++)
{
std::cout << _array[i] << '\t';
}
std::cout << std::endl
<< "the variable front is: " << _front << std::endl
<< "the variable back is: " << _back << std::endl;
}
template class MyQueue<int>;
template class MyQueue<float>;
template class MyQueue<double>;
main.cpp
#include <iostream>
#include "MyQueue.h"
int main()
{
MyQueue<int> queue1;
int num;
for(int i = 0; i < N; i++) // 当front==0,back==N-2时,队列满,不能再入队列
{
std::cout << "enquence a integrate number:" << std::endl;
std::cin >> num;
queue1.enqueue(num);
}
for(int i = 0; i < N ; i++) // front==back时,队列空,不能再出队列
std::cout << "dequence a number, the number is: " << queue1.dequeue() << std::endl;
queue1.show_array();
MyQueue<int> queue2;
for(int i = 0; i < N - 1; i++)
{
std::cout << "enquence a integrate number:" << std::endl;
std::cin >> num;
queue2.enqueue(num);
}
std::cout << "dequence a number, the number is: " << queue2.dequeue() << std::endl; // 此时队列满,不能再入队列
std::cout << "enquence a integrate number:" << std::endl;
std::cout << "dequence a number, the number is: " << queue2.dequeue() << std::endl;
std::cout << "enquence a integrate number:" << std::endl;
std::cout << "dequence a number, the number is: " << queue2.dequeue() << std::endl;
std::cout << "enquence a integrate number:" << std::endl;
std::cin >> num;
queue2.enqueue(num); // 此时可以再入队列
std::cout << "enquence a integrate number:" << std::endl;
std::cin >> num;
queue2.enqueue(num);
std::cout << "enquence a integrate number:" << std::endl;
std::cin >> num;
queue2.enqueue(num);
queue2.show_array();
return 0;
}
运行结果:
这里入队列和出队列的英文写错了,抱歉