c++数据结构之 队列

队列的特点

队列(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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值