交流配对C++
假設(shè)在交流會上,男生和女生分成兩隊,每一輪交流中,依次從男隊和女隊的隊頭各出一個人,兩人組成一個交流組進(jìn)行交流,交流后兩人分別回歸自己隊伍的尾部。若兩隊初始人數(shù)不同,則較長那一隊中沒有交流對象的人等待下一輪的配對交流。寫一算法,模擬上述配對問題,并輸出每次配對結(jié)果。如:男隊和女隊的人數(shù)分別是5和3,每隊的人都有一個編號(分別是12345和123),共交流4輪,則第一輪配對輸出<1,1> <2,2><3,3>,第二輪配對輸出<4,1> <5,2> < 1,3>。
直接上代碼
#include<stdio.h> #include<stdlib.h> #define SIZE 100 //最大隊列長度typedef struct {int *base; //初始化動態(tài)分配空間int front;int rear; } SqQueue;void InitQueue(SqQueue &Q){//構(gòu)造一個空隊列Q.base=(int *)malloc(SIZE * sizeof(int));if (!Q.base) exit(0);else Q.front = Q.rear = 0;}int QueueLength(SqQueue Q){//求隊列的長度return (Q.rear - Q.front + SIZE) % SIZE; }int QueueEmpty(SqQueue Q){//判空if (Q.rear == Q.front) return 1;else return 0; }void EnQueue(SqQueue &Q,int e){//插入元素e為Q的新的隊尾元素if ((Q.rear + 1) % SIZE == Q.front) exit(0);else Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % SIZE;}void DeQueue(SqQueue &Q,int &e){// 刪除Q的隊頭元素, 并用e返回其值if ((Q.rear+1)%SIZE==Q.front) exit(0);else e=Q.base[Q.front];Q.front=(Q.front+1)%SIZE; } void GetHead(SqQueue Q,int &e){// 取Q的隊頭元素, 并用e返回其值if ((Q.rear+1)%SIZE==Q.front) exit(0);else e=Q.base[Q.front];} void DancingPartner(SqQueue &M,SqQueue &W){//交流配對 int i, j, n, min, len1, len2, man, woman, first;len1 = QueueLength(M);len2 = QueueLength(W);min = len1 < len2? len1: len2;printf("請輸入交流的輪數(shù):"); scanf("%d", &n); for(i = 1; i <= n; i++){printf("第%d組配對交流:\n", i);for(j = 0; j < min; j++){DeQueue(M, man); DeQueue(W, woman);printf("<%d, %d>\n", man, woman);EnQueue(M,man); EnQueue(W, woman);}if(len1 > len2) GetHead(M, first);else GetHead(W, first);printf("下一個輪討論首人是:%d\n", first);} } int main() {int name; SqQueue M, W; InitQueue(M); InitQueue(W); printf("男生:(0表示結(jié)束)\n");scanf("%d",&name);while(name) {EnQueue(M, name);scanf("%d", &name);} printf("女生:(0表示結(jié)束)\n");scanf("%d", &name);while(name){EnQueue(W, name);scanf("%d", &name);}DancingPartner(M, W); return 0; }總結(jié)
- 上一篇: 栈(顺序栈)
- 下一篇: VS Code运行C和C++程序