前言
C++顺序表实现循环队列
直接用顺序表实现队列的话,会存在假溢出浪费内存当代情况
因为循环队列空的时候,队满的时候都是front=rear
队满判断有两种,一种是设置flag,添加后flag=1;删除后flag=0,队满:front==rear&&flag=1
一种为少用一个存储单位:队满:front==(rear+1)%size
这里用的是第二种方法
队列出队是在头位置的下一个,队列入队是在为位置入队
一、具体函数
1,出队操作
2,入队操作
3,取队首操作
4,初始化循环队列
5,判断循环队列是否为空
二、完整代码
代码如下(示例):
#include<iostream>
#define QueueSize 10//定义循环队列大小为10
typedef int Datatype;//给int 取一个别名叫Datatype
using namespace std;
/*
顺序表实现循环队列
直接用顺序表实现队列的话,会存在假溢出浪费内存当代情况
因为循环队列空的时候,队满的时候都是front=rear
队满判断有两种,一种是设置flag,添加后flag=1;删除后flag=0,队满:front==rear&&flag=1
一种为少用一个存储单位:队满:front==(rear+1)%size
这里用的是第二种方法
*/
typedef struct Sequeue {
Datatype queue[QueueSize];//数组大小
int front;//头位置
int rear;//尾位置
};
int main() {
return 0;
}
void InitQueue(Sequeue *q) {//队列初始化
q->front = q->rear = -1;//头尾坐标都指向-1是为初始化状态
}
int QuenEmpty(Sequeue *q) {//判断队列是否为空
if (q->front == q->rear ) {//如果头尾位置重合,队列为空
return 1;
}
else {
return 0;
}
}
int EnQueuen(Sequeue* q, Datatype x) {//入队操作
if (q->front == (q->rear + 1) % QueueSize) {//对队列大小取余,如果头位置再加一个位置就是尾指针,代表队列满了
cout << "队满";
return 0;
}
else {
q->rear = (q->rear + 1) % QueueSize;//用取余数的方式达到循环的目的
q->queue[q->rear] = x;//将给的值x传入这个queue数组中
}
}
int DelQueue(Sequeue *q,Datatype *e) {//出队
if (q->front == q->rear) {//对队列大小取余,如果头位置再加一个位置就是尾指针,代表队列满了
cout << "队空"<<endl;
return 0;
}
else {
q->front = (q->front + 1) % QueueSize;//出队是头位置的位置加1
*e = q->queue[q->front];//保存这个被删除的值
return 1;
}
}
int GetHead(Sequeue*q,Datatype *e) {//取表头函数也就是队首
if (q->front == q->rear) {//对队列大小取余,如果头位置再加一个位置就是尾指针,代表队列满了
cout << "队空" << endl;
return 0;
}
else {
*e = q->queue[q->front+1];//取头位置的后一个位置的数就是队首
return 1;
}
}
总结
如果对你有用的话,点个
呐