数据结构-线性结构-队列-顺序队的初步实现

#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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值