首页 > 其他分享 >循环队列(顺序)的实现:舞伴问题

循环队列(顺序)的实现:舞伴问题

时间:2023-03-29 11:34:47浏览次数:53  
标签:顺序 pt 队列 sq 舞伴 elem queue dancer

一、问题引入

舞伴配对问题:
假设在周末舞会上, 男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题
先入队的男士或女士应先出队配成舞伴, 因此该问题具有典型的先进先出特性,可用队列作为算法的数据结构

源码仓库地址 Dance_partner

二、解决过程

  • 由用户输入舞者人数以及舞者的姓名和性别,男性舞者到男队排队,女性舞者到女队排队。

  • 男队和女队分别出一个舞者进行配对,直到男队或女队为空才结束配对

  • 输出男队和女队剩余人数

2-1 队列定义

#define MAX_Q_SIZE 100 // 队列空间最大长度

#define ERROR -1
#define OK 0
#define OVERFLOW 1

typedef struct
{
	char name[10];
	char sex;
}Person_T;

typedef Person_T QElemType;

typedef struct
{
	QElemType *base;  // 存储空间的基地址
	int front;        // 头指针
	int rear;         // 尾指针
}SqQueue_T;

2-2 队列操作

  • 队列初始化
int queue_init(SqQueue_T *sq_queue_pt)
{
	sq_queue_pt->base = (QElemType *)malloc(MAX_Q_SIZE * sizeof(QElemType));
	if (NULL == sq_queue_pt->base)
		exit(OVERFLOW);
	memset(sq_queue_pt->base, 0, MAX_Q_SIZE * sizeof(QElemType));
	sq_queue_pt->front = 0;
	sq_queue_pt->rear = 0;
	return OK;
}
  • 队列销毁
int queue_destory(SqQueue_T *sq_queue_pt)
{
	if (NULL != sq_queue_pt->base)
		free(sq_queue_pt->base);
	sq_queue_pt->front = 0;
	sq_queue_pt->rear = 0;
	return OK;
}
  • 求队列长度
int queue_length(SqQueue_T *sq_queue_pt)
{
	return  (sq_queue_pt->rear - sq_queue_pt->front + MAX_Q_SIZE) % MAX_Q_SIZE;
}
  • 入队
int queue_push(SqQueue_T *sq_queue_pt, QElemType elem)
{
	// 判断是否队满(循环队列),若队列为满,则报错
	if ((sq_queue_pt->rear + 1) % MAX_Q_SIZE == sq_queue_pt->front)
		return ERROR;
	sq_queue_pt->base[sq_queue_pt->rear] = elem;
	sq_queue_pt->rear = (sq_queue_pt->rear + 1) % MAX_Q_SIZE;
	return OK;
}
  • 出队
int queue_pop(SqQueue_T *sq_queue_pt, QElemType *elem)
{
	// 判断是否对空,若队列为空,则报错
	if (sq_queue_pt->front == sq_queue_pt->rear)
		return ERROR;
	*elem = sq_queue_pt->base[sq_queue_pt->front];
	sq_queue_pt->front = (sq_queue_pt->front + 1) % MAX_Q_SIZE;
	return OK;
}
  • 取队头元素
QElemType * queue_head_elem_get(SqQueue_T *sq_queue_pt)
{
	//若队列为空,则返回空指针NULL
	QElemType *p_elem;
	if (sq_queue_pt->front == sq_queue_pt->rear)
		p_elem = NULL;
	else
		p_elem = &sq_queue_pt->base[sq_queue_pt->front];
	return p_elem;
}
  • 判断队列是否为空
int  queue_empty(SqQueue_T *sq_queue_pt)
{
	// 若队列为空,则返回值为非0值
	return !((sq_queue_pt->rear - sq_queue_pt->front + MAX_Q_SIZE) % MAX_Q_SIZE);
}

2-3 main()

标签:顺序,pt,队列,sq,舞伴,elem,queue,dancer
From: https://www.cnblogs.com/caojun97/p/17265827.html

相关文章

  • 面试题59 - II. 队列的最大值(剑指offer)
    题目描述:请定义一个队列并实现函数max_value得到队列里的最大值,要求函数max_value、push_back和pop_front的均摊时间复杂度都是O(1)。若队列为空,pop_front和max_v......
  • 进程消息队列实例
    //write.c#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<stdio.h>structmymesg{longmtype;//消息的类型,是一个整数且大于0......
  • 【单调队列】LeetCode 239. 滑动窗口最大值
    题目链接239.滑动窗口最大值思路单调队列的使用方法,可以参考【单调队列】LeetCode面试题59-II.队列的最大值在本题中将滑动窗口的移动看作往队列中放数和取数的过......
  • sql 执行顺序
    https://mp.weixin.qq.com/s?__biz=MjM5NzEyMzg4MA==&mid=2649468111&idx=6&sn=a87a37d675039f92dfd1df76a65c8a5f&chksm=bec1ce8889b6479ef314f7ea1aa4204eb9b1d4037847bf......
  • Spring Aop 常见注解和执行顺序
    SpringAop常见注解和执行顺序IOC、AOP、Bean注入、Bean的生命周期、Bean的循环依赖首先我们一起来回顾一下SpringAop中常用的几个注解:@Before 前置通知:目......
  • 用 Go 剑指 Offer 09. 用两个栈实现队列
    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHe......
  • Tomcat 启动时类加载顺序
    Tomcat启动时类加载顺序Tomcat启动时classloader加载顺序  Tomcat的class加载的优先顺序一览    1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。   ......
  • 力扣88.合并两个有序数组【顺序表】
    ......
  • 为什么要执行产值冲减的原因--因为系统设计的逻辑问题--产值冲减、工程结算、收入台账
    1.系统设计时间逻辑的问题1.PM系统的时间逻辑flowchartLRA["产值冲减(时间A:统计月份)"]-->B["工程结算(时间B:结算月份)"]-->C["收入台账(时间C:统计月份)"]2.问题的发生......
  • java 类的初始化顺序
    父类的静态字段-->父类静态代码块-->子类静态字段-->子类的静态代码块-->父类成员变量-->父类构造代码块-->父类构造方法-->子类成员变量-->子类构造代码块-->子类构造方法......