对于数组实现,初学的难点就在于,要会下标(也就是指针)的计算,利用取余%操作,实现循环操作,也就是从原始的front++变成了front = (front+1)%MAX_Q;此外,还有数组实现的一个歧义点,就是rear指向的是最后一个元素,还是最后一个元素的下一个空位(我个人倾向这种理解方式,因为其方便理解)
再一个,循环队列有一个难点,就是如何判断满or空?
直接说吧,判空==>就是front == rear
判满==>用的最多的,浪费一个空间的方法,也就是(rear+1)%MAX_Q== front
#include<iostream>
#include<math.h>
using namespace std;
#define MAX_Q 10
typedef struct Queue {
int* data;
int front;//队首指针
int rear;//队尾指针
}queue;
queue Init()
{
queue q;
q.data = new int[MAX_Q];
q.front = 0;
q.rear = 0;
return q;
}
void Push(Queue& q, int k)
{
//选择浪费一个内存空间来判断空or满
if ((q.rear + 1) % MAX_Q == q.front)//判满
{
cout << "循环队列满,无法入队" << endl;
return;
}
q.data[q.rear] = k;
q.rear = (q.rear + 1) % MAX_Q;
}
//选择浪费一个内存空间来判断空or满
bool Empty(const Queue& q) {
if (q.front == q.rear)
{
return true;
}
return false;
}
void Pop(Queue& q) {
if (Empty(q))
{
cout << "队空,无法出队" << endl;
return;
}
cout << "出队:" << q.data[q.front] << endl;
q.front = (q.front + 1) % MAX_Q;
}
void Show(Queue& q) {
for (int i = q.front; i < q.rear; i++,i%=MAX_Q)
{
cout << q.data[i] << ' ';
}
cout << endl;
}
int main() {
queue q = Init();
Push(q, 1);
Push(q, 12);
Push(q, 123);
Push(q, 1234);
Show(q);
Pop(q);
Pop(q);
Show(q);
return 0;
}
644

被折叠的 条评论
为什么被折叠?



