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