数据结构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;
}
大佬们勿喷,感谢观看!
下一篇:
【算法】约瑟夫环原理及其公式
