当前位置: 首页 > news >正文

【数据结构】非循环队列

数据结构 非循环队列

参考代码如下:

/*
	名称:非循环队列
	编译环境:VC++ 6.0
	日期: 2014年4月4日
*/
#include<stdio.h>
#include<windows.h>
#include <malloc.h>
#include <stdlib.h>

typedef int QElemType;

// 顺序队列(非循环,因为是非循环的,所以需要判断是否溢出
#define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1) 
typedef struct
{
	QElemType *base;// 初始化的动态分配存储空间 相当于一个数组 
	// 头指针,若队列不空,指向队列头元素,相当于一个数组下标
	int front;
	// 尾指针,若队列不空,指向队列尾元素的下一个位置 相当于一个数组下标
	int rear;
}SqQueue;

// 构造一个空队列Q
int InitQueue(SqQueue *Q)
{ 
	//分配定长的空间,相当于一个数组
	(*Q).base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
	if(!(*Q).base) // 存储分配失败 
		exit(0);
	(*Q).front=(*Q).rear=0;	//初始化下标
	return 1;
}

// 销毁队列Q,Q不再存在
int DestroyQueue(SqQueue *Q)
{ 
	if((*Q).base)
		free((*Q).base);
	(*Q).base=NULL;
	(*Q).front=(*Q).rear=0;
	return 1;
}

// 将Q清为空队列
int ClearQueue(SqQueue *Q)
{ 
	(*Q).front=(*Q).rear=0;
	return 1;
}

// 若队列Q为空队列,则返回1,否则返回0 
int QueueEmpty(SqQueue Q)
{
	if(Q.front==Q.rear) // 队列空的标志 
		return 1;
	else
		return 0;
}

// 返回Q的元素个数,即队列的长度 
int QueueLength(SqQueue Q)
{
	return(Q.rear-Q.front);
}

// 若队列不空,则用e返回Q的队头元素,并返回1,否则返回0 
int GetHead(SqQueue Q,QElemType *e)
{
	if(Q.front==Q.rear) // 队列空 
		return 0;
	*e=*(Q.base+Q.front);
	return 1;
}

// 插入元素e为Q的新的队尾元素 
int EnQueue(SqQueue *Q,QElemType e)
{
	if((*Q).rear>=MAXQSIZE)
	{ // 队列满,增加1个存储单元 
		(*Q).base=(QElemType *)realloc((*Q).base,
			((*Q).rear+1)*sizeof(QElemType));
		if(!(*Q).base) // 增加单元失败 
			return 0;
	}
	*((*Q).base+(*Q).rear)=e;
	(*Q).rear++;
	return 1;
}

// 若队列不空,则删除Q的队头元素,用e返回其值,并返回1,否则返回0 
int DeQueue(SqQueue *Q,QElemType *e)
{
	if((*Q).front==(*Q).rear) // 队列空 
		return 0;
	*e=(*Q).base[(*Q).front];
	(*Q).front=(*Q).front+1;
	return 1;
}

// 从队头到队尾依次对队列Q中每个元素调用函数vi()
int QueueTraverse(SqQueue Q,void(*vi)(QElemType))
{
	int i;
	i=Q.front;
	while(i!=Q.rear)
	{
		vi(*(Q.base+i));
		i++;
	}
	printf("\n");
	return 1;
}


void visit(QElemType i)
{
	printf("%d ",i);
}

int main()
{
	int j;
	int i,n;
	QElemType d;
	SqQueue Q;
	
	InitQueue(&Q);
	printf("初始化队列后,队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
	printf("队列长度为:%d\n",QueueLength(Q));
	printf("请输入队列元素个数n: ");
	scanf("%d",&n);
	printf("请输入%d个整型队列元素:\n",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&d);
		EnQueue(&Q,d);
	}
	printf("队列长度为:%d\n",QueueLength(Q));
	printf("现在队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
	printf("现在队列中的元素为: \n");
	QueueTraverse(Q,visit);
	DeQueue(&Q,&d);
	printf("删除队头元素%d\n",d);
	printf("队列中的元素为: \n");
	QueueTraverse(Q,visit);
	j=GetHead(Q,&d);
	if(j)
		printf("队头元素为: %d\n",d);
	else
		printf("无队头元素(空队列)\n");
	ClearQueue(&Q);
	printf("清空队列后, 队列空否?%u(1:空 0:否)\n",QueueEmpty(Q));
	j=GetHead(Q,&d);
	if(j)
		printf("队头元素为: %d\n",d);
	else
		printf("无队头元素(空队列)\n");
	DestroyQueue(&Q);
	
	system("pause");
	return 0;
}
/*
输出效果:

初始化队列后,队列空否?1(1:空 0:否)
队列长度为:0
请输入队列元素个数n: 3
请输入3个整型队列元素:
1 2 3
队列长度为:3
现在队列空否?0(1:空 0:否)
现在队列中的元素为:
1 2 3
删除队头元素1
队列中的元素为:
2 3
队头元素为: 2
清空队列后, 队列空否?1(1:空 0:否)
无队头元素(空队列)
请按任意键继续. . . 

*/
运行结果如下:



相关文章:

  • 【JavaScript】encodeURI() 函数
  • 【JavaScript】 encodeURI() 函数
  • 关系型数据库跟费关系型数据库区别
  • 使用json往返传输数据 post方法
  • ubuntu下没有中文输入法的解决办法!
  • 【jQuery 遍历】 - map() 方法
  • HTML中的Meta http-equiv属性详解(转)
  • 【jQuery 】参考手册 - 遍历
  • 在构造方法中存在异常的惯用处理法
  • 在Ajax中使用XML通信
  • 平衡二叉树旋转
  • 用XPath和XSLT来更好的处理XML
  • sublime text3主题透明
  • JAR文件包及jar命令详解
  • String和Integer的特例
  • 分享的文章《人生如棋》
  • “大数据应用场景”之隔壁老王(连载四)
  • Django 博客开发教程 8 - 博客文章详情页
  • JS 面试题总结
  • Median of Two Sorted Arrays
  • Python实现BT种子转化为磁力链接【实战】
  • Redis的resp协议
  • SQLServer之创建显式事务
  • TCP拥塞控制
  • Webpack 4 学习01(基础配置)
  • 编写高质量JavaScript代码之并发
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 高度不固定时垂直居中
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于axios的vue插件,让http请求更简单
  • 七牛云假注销小指南
  • 入口文件开始,分析Vue源码实现
  • 时间复杂度与空间复杂度分析
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 探索 JS 中的模块化
  • 小程序开发之路(一)
  • 新手搭建网站的主要流程
  • 7行Python代码的人脸识别
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 如何用纯 CSS 创作一个货车 loader
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $GOPATH/go.mod exists but should not goland
  • (2)nginx 安装、启停
  • (2)STM32单片机上位机
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)c52学习之旅-点亮LED灯
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)Unity3DUnity3D在android下调试
  • .Mobi域名介绍