C++队列
Posted 桃陉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++队列相关的知识,希望对你有一定的参考价值。
一.基本介绍
队列,一种先进先出(FIFO,First-In-First-Out)的线性表,通常用链表或者数组来实现。队列只允许在后端(rear)插入,在前端(front)取出删除。
与堆栈唯一的区别就是只允许新数据在尾部添加。
我们用数组来实现队列,需要以下4个基本变量:
变量名 | 含义 |
---|---|
arr | 存储数据的数组 |
maxSize | 队列的最大容量 |
front | 队列头,随着数据输出而改变 |
rear | 队列尾,随着数据输入而改变 |
基本思路:
front和rear开始时都指向数组头,当插入数据时rear指针加1,当删除数据时front指针加1,当front==rear时,说明队列已经为空。如果rear=maxSize-1表示队列已满。
但是我们会发现如果这样操作的话,这个队列就是一次性的,这个队列最终能存放的数只有maxSize个,当rear=maSize-1时,这个队列已经废了。
所以我们可以考虑将其改造成循环队列,也就是让数组首尾相接,这样可以循环往复的存取元素。
此时,front的含义不变,而rear指向队列中最后一个元素的下一个位置。
队列满的标志就变为:(rear+1)%maxSize==front
队列中元素存放的个数为:(rear+maxSize-front)%maxSize
实现如下函数:
函数名 | 作用 |
---|---|
pop() | 返回队首元素并删除 |
push(int num) | 将num插入队尾 |
head() | 查找队首元素(不删除) |
tail() | 查找队尾元素 |
print() | 打印队列元素 |
isEmpty() | 判断队列是否为空,为空返回true |
isFull() | 判断队列是否已满,已满返回true |
length() | 返回队列中元素个数 |
二.代码实现
#include<iostream>
#include<cstdlib>
using namespace std;
/*
使用循环数组列实现队列
*/
class Queue
{
private:
int front;
int rear;
int maxSize;
int *arr;
public:
//构造函数
Queue(int maxSize)
{
front=0;
rear=0;
maxSize = maxSize+1;
arr = new int[maxSize];
}
//取出并删除队首元素
int pop()
{
if(isEmpty())
{
cout<<"队列为空"<<endl;
return -1;
}
int value = arr[front];
//因为是循环队列,所以front的位置也需要取模计算
front = (front+1)%maxSize;
return value;
}
//添加元素到队尾
void push(int num)
{
if(isFull())
{
cout<<"队列已满"<<endl;
return ;
}
arr[rear]=num;
rear = (rear+1)%maxSize;
}
//查看队首元素不删除
int head()
{
if(isEmpty())
{
cout<<"队列为空"<<endl;
return -1;
}
return arr[front];
}
//查看队尾元素
int tail()
{
if(isEmpty())
{
cout<<"队列为空"<<endl;
return -1;
}
//当rear=1时,减一就变成了-1
return rear-1<0?arr[maxSize-1]:arr[rear-1];
}
//打印队列元素
void print()
{
if(isEmpty())
{
cout<<"队列为空"<<endl;
return ;
}
for(int i=front;i<front+length();i++)
{
int index = i%maxSize;
cout<<"arr["<<index<<"] = "<<arr[index]<<endl;
}
}
//判断队列是否为空
bool isEmpty()
{
return rear==front;
}
//判断队列是否已满
bool isFull()
{
return (rear+1)%maxSize==front;
}
//计算队列中元素个数
int length()
{
return (rear+maxSize-front)%maxSize;
}
};
int main()
{
Queue q=Queue(10);
q.push(1);
q.push(3);
q.push(5);
q.pop();
q.push(7);
q.push(11);
cout<<"length = "<<q.length()<<endl;;
cout<<"head = "<<q.head()<<endl;
cout<<"tail = "<<q.tail()<<endl;
q.print();
system("pause");
return 0;
}
三.结果展示
以上是关于C++队列的主要内容,如果未能解决你的问题,请参考以下文章