#include<iostream>
#include<cstdlib>
#include<cstdio>
#define OK 1
#define ERROR -1
#define INIT_SIZE 4
typedef int Status;
typedef int QElemType;
typedef struct queue{
QElemType* base;
long head;
long end;
bool target;
}Queue;
Status InitQueue(Queue& Q);
Status CreateQueue(Queue& Q);
Status DestroyQueue(Queue& Q);
Status ClearQueue(Queue& Q);
Status QueueEmpty(Queue& Q);
long QueueLength(Queue& Q);
QElemType GetHead(Queue& Q);
Status EnQueue(Queue& Q,QElemType e);
Status DeQueue(Queue& Q,QElemType& e);
Status QueueTraverse(Queue& Q);
int main() {
Queue Q = { 0,0,0,0 };
QElemType e = 0;
CreateQueue(Q);
QueueTraverse(Q);
EnQueue(Q, 999);
QueueTraverse(Q);
std::cout << QueueLength(Q) << std::endl;
DestroyQueue(Q);
QueueTraverse(Q);
InitQueue(Q);
QueueTraverse(Q);
EnQueue(Q, 999);
QueueTraverse(Q);
EnQueue(Q, 777);
QueueTraverse(Q);
EnQueue(Q, 333);
QueueTraverse(Q);
DeQueue(Q, e);
QueueTraverse(Q);
EnQueue(Q, 999);
QueueTraverse(Q);
EnQueue(Q, 777);
QueueTraverse(Q);
std::cout << GetHead(Q) << std::endl;
ClearQueue(Q);
std::cout << QueueEmpty(Q) << std::endl;
QueueTraverse(Q);
return 0;
}
Status InitQueue(Queue& Q){
if(Q.base){
std::cerr<<"请勿重复申请内存空间"<<std::endl;
return ERROR;
}
Q.base = (QElemType*)malloc(sizeof(QElemType)*INIT_SIZE);
if(!Q.base){
std::cerr<<"申请内存出现错误"<<std::endl;
exit(ERROR);
}
Q.end = 0;
Q.head = 0;
Q.target = false;
return OK;
}
Status CreateQueue(Queue& Q) {
if (InitQueue(Q) == ERROR) {
return ERROR;
}
std::cout << "请输入队列的元素个数n:";
int i;
std::cin >> i;
if (i <= 0 || i > INIT_SIZE) {
std::cerr << "输入的数字不合法。" << std::endl;
return ERROR;
}
Q.end = i - 1;
Q.target = true;
std::cout << "请输入创建的队列的各个元素。\n" << "共" << i << "个元素:" << std::endl;
for (int n = 0; n < i; ++n) {
QElemType e = 0;
std::cin >> e;
Q.base[n] = e;
}
return OK;
}
Status DestroyQueue(Queue& Q){
if(!Q.base){
std::cerr<<"要销毁的队列不存在。"<<std::endl;
return ERROR;
}
free(Q.base);
Q.base = 0;
Q.head = -1;
Q.end = -1;
Q.target = false;
return OK;
}
Status ClearQueue(Queue& Q){
if(!Q.base){
std::cerr<<"要清空的队列不存在。"<<std::endl;
return ERROR;
}
Q.head = 0;
Q.end = 0;
Q.target = false;
return OK;
}
Status QueueEmpty(Queue& Q){
if(!Q.base){
std::cerr<<"要查询的队列不存在。"<<std::endl;
return ERROR;
}
return !Q.target?true:false;
}
long QueueLength(Queue& Q){
if(!Q.base){
std::cerr<<"要查询的队列不存在。"<<std::endl;
return ERROR;
}
return (Q.end - Q.head + 1 + INIT_SIZE) % INIT_SIZE;
}
QElemType GetHead(Queue& Q){
if(!Q.base){
std::cerr<<"要查询的队列不存在。"<<std::endl;
return ERROR;
}
if(!Q.target){
std::cerr<<"队列为空。"<<std::endl;
return ERROR;
}
return Q.base[Q.head];
}
Status EnQueue(Queue& Q,QElemType e){
if(!Q.base){
std::cerr<<"要修改的队列不存在。"<<std::endl;
return ERROR;
}
if (Q.head == (Q.end+1)%INIT_SIZE && Q.target) {
std::cerr << "队列已满。" << std::endl;
return ERROR;
}
if (!Q.target) {
Q.base[Q.end] = e;
Q.target = true;
}
else {
Q.end = (Q.end + 1) % INIT_SIZE;
Q.base[Q.end] = e;
}
return OK;
}
Status DeQueue(Queue& Q,QElemType& e){
if(!Q.base){
std::cerr<<"要修改的队列不存在。"<<std::endl;
return ERROR;
}
e = Q.base[Q.head];
if (Q.head == Q.end) {
Q.target = false;
}
else {
Q.head = (Q.head + 1) % INIT_SIZE;
if (Q.head == Q.end) {
Q.target = false;
}
}
return OK;
}
Status QueueTraverse(Queue& Q){
if(!Q.base){
std::cerr<<"要查询的队列不存在。"<<std::endl;
return ERROR;
}
if(!Q.target){
std::cerr<<"队列为空。"<<std::endl;
return ERROR;
}
int temp = Q.head;
std::cout << Q.base[temp] << " " << std::ends;
while (temp != Q.end){
temp = (temp + 1) % INIT_SIZE;
std::cout<<Q.base[temp]<<" "<<std::ends;
}
std::cout << std::endl;
return OK;
}
数据结构-线性结构-队列-顺序队的初步实现
最新推荐文章于 2024-10-02 08:00:00 发布
本文介绍了使用C++编写的队列类,包括初始化、创建、销毁、清空、判断队列是否为空、获取队首元素、入队和出队等操作的函数实现。
摘要由CSDN通过智能技术生成