数据结构C语言实现队列

数据结构中,基于C语言的队列实现,并进行应用。

题目为舞伴问题,利用队列可以完美的解决。

/*
Yuuu。
—2022-3-19
17点25分 
*/ 
#include<stdio.h>
#include<malloc.h>
#include<iostream>
using namespace std;
#define MAXQSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char QElemType;
typedef struct
{
	char name[20];     //姓名 
	char sex;          //性别,F表示女性,M表示男性 
}Person;
typedef struct
{
	Person *base;         //队列中数据元素类型为Person 
	int front;            //头指针 
	int rear;             //尾指针 
}SqQueue;
SqQueue Mdancers,Fdancers;//分别存放男士和女士入队者队列
 
Status InitQueue (SqQueue &Q) // 构造一个空队列 Q
{          
    Q.base=new Person[MAXQSIZE];
    if ( ! Q.base ) exit ( OVERFLOW ); // 存储分配失败
    Q.front = Q.rear = 0; // 初始时,循环队列没有元素
    return OK;
} // 
 
Status EnQueue ( SqQueue &Q, Person e )// 若队列满,则返回 ERROR;若队列不满,则插入元素 e 为队列 Q 新的队尾元素。
{
    if ( ( Q.rear + 1 ) % MAXQSIZE == Q.front )
	   return ERROR; // 如果循环队列满,则出错
    Q.base[ Q.rear ] = e; // 将 e 插入到循环队列尾
	Q.rear = ( Q.rear + 1 ) % MAXQSIZE; // 修改队尾指针
	return OK;
} // 
 
Status DeQueue ( SqQueue &Q, Person &e ) // 若队列空,则返回 ERROR;若队列不空,则删除 Q 的队列头元素,用 e 返回其值,并返回 OK 。
{
    if ( Q.front == Q.rear ) return ERROR; // 如果循环队列空,则出错
    e = Q.base [ Q.front ]; // 将循环队列头的元素取出
    Q.front = ( Q.front + 1 ) % MAXQSIZE; // 修改队头指针
    return OK;
} // 
 
Person GetHead(SqQueue Q)    //返回Q的对头元素,不修改指针 
{
	if(Q.front!=Q.rear)         //队列非空 
	    return Q.base[Q.front]; //返回对头元素的值,对头指针不变 
 } 
 
Status QueueEmpty(SqQueue &Q)
{
	if(Q.front == Q.rear) return OK;
	else return ERROR;
}
 
void DancePartner(Person dancer[] , int num)//结构数组danccer中存放跳舞的男女,num是跳舞的人数 
{
	Person p;
	SqQueue Mdancers,Fdancers;
	InitQueue(Mdancers);          //男士队列初始化 
	InitQueue(Fdancers);          //女士队列初始化 
	for(int i=0;i<num;i++)        //依次将跳舞者根据性别入队 
	{
		p=dancer[i];
		if(p.sex==F) EnQueue(Fdancers,p);  //插入女队 
		else EnQueue(Mdancers,p);            //插入男队 
	 } 
    cout<<"现在跳舞的是:
";
    while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))//依次输出男女舞伴的姓名 
    {
    	DeQueue(Fdancers,p);     //女士出队 
    	cout<<p.name<<"  ";      //输出出队女士姓名 
    	DeQueue(Mdancers,p);     //男士出队 
    	cout<<p.name<<endl;      //输出出队男士姓名 
	}
	if(!QueueEmpty(Fdancers))    //女士队列非空,输出队头女士的姓名 
	{
		p=GetHead(Fdancers);     //取女士队头 
		cout<<"下位跳舞的女士:"<<p.name<<endl;
	}
	else if(!QueueEmpty(Mdancers))//男士队列非空,输出队头男士的姓名 
	{
		p=GetHead(Mdancers);     //取男士队头
		cout<<"下位跳舞的男士:"<<p.name<<endl;
	}
}
 
int main()
{
	int n;
	Person dancer[MAXQSIZE];
	cout<<"请输入跳舞的人数:";
	cin>>n;
	while(n<=0)
	{
		cout<<"输入错误,请重新输入跳舞人数:";
		cin>>n;
	 } 
    for(int i=1;i<=n;i++)
    {
    	cout<<"请输入第"<<i<<"舞者的名字:"<<endl;
    	cin>>dancer[i-1].name;
    	cout<<"请输入第"<<i<<"个人的性别(F/M):"<<endl;
    	cin>>dancer[i-1].sex;
    	while(dancer[i-1].sex!=F&&dancer[i-1].sex!=M)
    	{
    		cout<<"输入错误,请重新输入:
";
    		cout<<dancer[i-1].sex;
            cout<<"请输入第"<<i<<"个人的性别(F/M):"<<endl;
            cin>>dancer[i-1].sex;
            break;
		}
	}
	DancePartner(dancer,n);
	return 0;
 }

大佬们勿喷,感谢观看!

经验分享 程序员 微信小程序 职场和发展