赞
踩
队列,一种先进先出(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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。