这个程序怎么写,具体思路是什么

有一打同一个花色的包括从A到K的十三张牌,初始时这十三张牌的顺序是随机(你们可以任意指定初始顺序)。把这一打牌正面朝下抓在手上,(1)先把最下面一张牌抽出来放到桌面上,(2)然后再把最下面一张牌抽出来放到这一打牌的最上面。然后反复执行上面的两步,问:当最后手上只剩下一张牌的时候,这张牌是多少

思路:
1.定义13个元素的数组,随机生成13个1~54之间的数字,代表54张牌。
2.从数组第一个元素和最后一个元素抽牌,然后设置为0;
3.循环读取,直到最后一个不为0的元素值。

这个要用队列来做,把十三张牌按照随机或任意指定顺序,倒着添加到队列中。
先从队列头弹出一个元素输出。再从队列头弹出一个元素重新添加到队列尾。反复执行这两步,直到队列为空

你题目的解答代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct node * PNode; //定义队列的每个节点的类型
typedef struct node {
    char *data;//每个节点中存放的数据
    PNode next;//下一节点
}Node;

typedef struct queue {
    PNode head;//队头
    PNode tail;//队尾
    int Length;//队列长度
}Queue;

Queue *GetQueue() { // 返回创建的新空队列
    Queue *queue = (Queue *)malloc(sizeof(Queue));  //创建存放队列的空间
    queue->head = (Node *)malloc(sizeof(Node));  //创建头指针结点的存放空间
    queue->head->next = NULL;   //头指针指向空指针
    queue->tail = queue->head;  //令队列的尾指针为队列的头指针,这是为了在第一个元素入队时,头指针的字针能够指向第一个元素。
    queue->Length = 0;
    return queue;
}

void EnQueue(Queue *Q,char *x) { // 将x送入队,每次都是在队尾加入新结点
    PNode newnode = (Node *)malloc(sizeof(Node));//产生新的结点
    newnode->data = x;  //新的结点数据域存放输入的x
    ++Q->Length;   //队列长度加一
    newnode->next = NULL;   //新产生的结点指向空指针
    Q->tail->next = newnode;  // 队尾指针指向新结点,当第一个元素x进来的时候,队尾指针相当于队头指针,那么也就是队头指针指向第一个进来的元素
    Q->tail = newnode; //接着就是队尾变成了刚刚进来的新结点,以此类推,下一个进来的新结点(假设为y)便是头结点指向x,x指向y,y指向nul
}

int notEmpty(Queue *Q) {
    return (Q->Length > 0);
}

int DeQueue(Queue *Q,char **x) { // 将x送出队
    PNode p;            //定义结点指针p
    if(notEmpty(Q)) {
        p = Q->head->next;   //  p的地址是头指针所指的下一个地址,也就是第一个元素的地址
        *x = p->data;   //访问p的地址,取该地址的数据域的数据
        Q->head->next = p->next;  //此时,将头指针指向p的下一个地址,即第二个元素。下一次调用函数便是p值为第二个(y),以此类推第三个、第四个。。。直到尾指针指向空指针结束
        --Q->Length;  //队列长度减一
        free(p);   //释放p的空间,此时p的地址也就是队列里面结点的地址
        return 1;
    }
    return 0;
}

int GetLength(Queue *Q) { // 获取队列长度
    return Q->Length;
}

char *GetFirst(Queue *Q) { // 获取队头数据
    return Q->head->next->data;
}

char *GetLast(Queue *Q) { // 获取队尾数据
    return Q->tail->data;
}


int main() {
    int i;
    Queue *Q = GetQueue();//定义一个新的队列
    char *s[13] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
    char *x;
    for (i = 12; i>=0; i--){
        EnQueue(Q,s[i]);
    }
    while (1)
    {
        DeQueue(Q,&x);
        printf("抽出最下面一张牌:%s\n", x);
        if (GetLength(Q)==1)
            break;
        DeQueue(Q,&x);
        EnQueue(Q,x);
        printf("抽出最下面一张牌:%s 放到最上面\n", x);
    }
    printf("最后手上只剩下一张牌:%s\n", GetFirst(Q));
    return 0;
}

img

如有帮助,望采纳!谢谢!