队列的特点
队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:
1.队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。
2.在队尾添加元素,在队头添加元素。rmaidjs.github.io/)
队列的相关概念:
(1)队头与队尾: 允许元素插入的一端称为队尾,允许元素删除的一端称为队头;
(2)入队:队列的插入操作;
(3)出队:队列的删除操作。
队列的操作:
(1)入队: 通常命名为push()
(2)出队: 通常命名为pop()
(3)求队列中元素个数
(4)判断队列是否为空
(5)获取队首元素
队列的分类:
(1)基于数组的循环队列(循环队列)
(2)基于链表的队列(链队列)
演示例子
例如我们有一个存储整型元素的队列,我们依次入队:{1,2,3}
添加元素时,元素只能从队尾一端进入队列,也即是2只能跟在1后面,3只能跟在2后面。
如果队列中的元素要出队:
元素只能从队首出队列,出队列的顺序为:1、2、3,与入队时的顺序一致,这就是所谓的“先进先出”。
简单的例子
#include <queue>
#include <iostream>
using namespace std;
int main(){
queue<int> q;
for (int i = 0; i < 10; i++){
q.push(i);
}
if (!q.empty()){
cout << "队列q非空!" << endl;
cout << "q中有" << q.size() << "个元素" << endl;
}
cout << "队头元素为:" << q.front() << endl;
cout << "队尾元素为:" << q.back() << endl;
for (int j = 0; j < 10; j++){
int tmp = q.front();
cout << tmp << " ";
q.pop();
}
cout << endl;
if (!q.empty()){
cout << "队列非空!" << endl;
}
system("pause");
return 0;
}
例子2、循环队列的C++实现
#include<queue>
#include<iostream>
using namespace std;
// int main(){
// queue<int> q;
// for (int i = 0;i<10;i++){
// q.push(i);
// }
// if(!q.empty()){
// cout<< "队列q非空"<<endl;
// cout<<"q中有"<< q.size() << "个元素" << endl;
// }
// cout << "队头元素为:" << q.front() << endl;
// cout << "队尾元素为:" << q.back() << endl;
// for(int j = 0; j<10; j++){
// int tmp = q.front();
// cout << tmp << " ";
// q.pop();
// }
// cout << endl;
// if(!q.empty()){
// cout << "队列非空" << endl;
// }
// }
template<typename T>
class CircularQueue
{
public:
CircularQueue(int c = 10);
~CircularQueue();
bool isEmpty(); //队列的判空
int size(); //队列的大小
bool push(T t); //入队列
bool pop(); //出队列
T front(); //队首元素
private:
int capacity;
int begin;
int end;
T* queue;
};
template<typename T>
CircularQueue<T>::CircularQueue(int c=10):capacity(c),begin(0),end(0),queue(nullptr)
{
queue = new T[capacity];
}
template<typename T>
CircularQueue<T>::~CircularQueue() //析构函数
{
delete[] queue;
}
template<typename T>
bool CircularQueue<T>::isEmpty()//判断队列是否为空
{
if(begin == end)
return true;
return false;
}
template<typename T>
int CircularQueue<T>::size() //判断队列内元素个数
{
return (end - begin + capacity) &capacity;//计算循环队列长度
}
template<typename T>
bool CircularQueue<T>::push(T t)
{
if (end + 1 % capacity == begin) //判断队列是否已满
{
return false;
}
queue[end] = t;
end = (end + 1) % capacity;
return true;
};
template <typename T>
bool CircularQueue<T>::pop() //判断队列是否为空
{
if (end == begin)
{
return false;
}
begin = (begin + 1) % capacity;
return true;
};
template <typename T>
T CircularQueue<T>::front()
{
if (end == begin)
{
return false;
}
return queue[begin];
};
int main()
{
CircularQueue<string> queue(6);
queue.push("one");
queue.push("two");
queue.push("three");
queue.push("four");
queue.push("five");
cout << "队列长度" << queue.size() << endl;
while (!queue.isEmpty())
{
cout << queue.front() << endl;
queue.pop();
}
getchar();
//system("pause");
return 0;
}