一.头文件
定义队列与队列的长度
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 10
typedef int status;
typedef struct
{
int n;
}number; //元素结构体
typedef struct sqqueue
{
number* data; //数据
int front; //队首
int rear; //队尾
}squsue;
二.实现函数
(1)初始化函数
先给队列分配空间,判断初始化是否成功。让队首与队尾都为0,返回状态OK
status initqueue(sqqueue& Q)
{
Q.data = new number[MAXSIZE];
if (!Q.data) return ERROR;
Q.front = Q.rear = 0;
return OK;
}
(2)入队函数
首先输入入队元素个数进入循环,在循环中if语句来判断队列是否已满,注意+1取模的操作,因为在循环队列中,有一位是空的,用于队列是否已满。如图所示:
status input(sqqueue& Q)
{
int n;
cout << "请输入元素个数:";
cin >> n;
cout << "请输入入队元素:";
for (int i = 0; i < n; i++)
{
if ((Q.rear + 1) % MAXSIZE == Q.front)
return ERROR;
cin >> Q.data[Q.rear].n;
Q.rear = (Q.rear + 1) % MAXSIZE;
}
return OK;
}
队尾加一时同样需要取模。
(3)出队函数
与入队操作类比,出队是在队首进行,所以出队操作第一步是判断队是否为空,如果不为空将当前队首元素输出,进行队首取模加一。
status output(sqqueue& Q)
{
if (Q.rear == Q.front)
return ERROR;
cout << "元素" << Q.data[Q.front].n << "以出队" << endl;
Q.front = (Q.front + 1) % MAXSIZE;
return OK;
}
(4)输出队首函数
只输出元素,不对队首进行操作不用加&。
status head(sqqueue Q)
{
if (Q.rear == Q.front) return ERROR;
cout << "当前队首元素为:" << Q.data[Q.front].n << endl;
return OK;
}
(5)判断队长函数
队长为队尾-队首+队的最大长度取模。
status length(sqqueue Q)
{
int n = (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
cout << "当前队长:" << n << endl;
return OK;
}
三.主函数
在主函数调用实现函数,进行验证。
int main()
{
squsue Q;
initqueue(Q);
input(Q);
head(Q);
length(Q);
output(Q);
head(Q);
length(Q);
return 0;
}
这是最后的输出效果:
F_NCIAE_A231_2022/3/19