彗星爱酿酒 2023-04-01 01:59 采纳率: 59.3%
浏览 68
已结题

关于队列的实现及基本操作问题

给定一个初始为空的队列和一系列入队、出队操作,请编写程序输出每次出队的元素。队列的元素值均为整数。
输入格式:
输入第1行为1个正整数n,表示操作个数;接下来n行,每行表示一个操作,格式为1 d或0。1 d表示将整数d入队,0表示出队。n不超过20000。
输出格式:
按顺序输出每次出队的元素,每个元素一行。若某出队操作不合法(如在队列空时出队),则对该操作输出invalid。
输入样例:
7
1 1
1 2
0
0
0
1 3
0
输出样例:
1
2
invalid
3
我的代码

#include <stdio.h>
#include <stdlib.h>
typedef struct QNode *PtrToQNode;
struct QNode{
    int *Data;
    int f;
    int r;
    int Max;
};
typedef PtrToQNode Queue;
Queue CreatQueue(int Max);
void AddQ(Queue Q,int X);
void DeleteQ(Queue Q);
int main(void){
    int i,n,flag,X;
    Queue Q=(Queue)malloc(sizeof(struct QNode));
    Queue CreatQueue();
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        //Q->Data=(int *)malloc(Max*sizeof(int));
        scanf("%d ",&flag);
        if(flag==1){
           scanf("%d",&X); 
            AddQ(Q,X);
        }else if(flag==0){
            DeleteQ(Q);
        }
        if(Q->f==Q->r){
            printf("invalid");
        }else{
            printf("%d\n",X);
        }
    }
}
Queue CreatQueue(int Max){
    Queue Q=(Queue)malloc(sizeof(struct QNode));
    Q->Data=(int *)malloc(Max*sizeof(int));
    Q->f=Q->r=NULL;
    Q->Max=Max;
    return Q;
}
void AddQ(Queue Q,int X){
    if((Q->r+1)%Q->Max==Q->f){
        printf("队列满");
    }else{
        Q->r=(Q->r+1)%Q->Max;
        Q->Data[Q->r]=X;
    }
}
void DeleteQ(Queue Q){
    if(Q->r==Q->f){
        printf("invalid");
    }else{
        Q->f=(Q->f+1)%Q->Max;
    }
}

对队列不太熟悉,希望有人能帮忙揪揪错,如果可以的请具体说说错误的地方,具体要怎么改呢?咳,希望可以讲的简单易懂一点(^ω^)

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2023-04-01 12:05
    关注

    供参考:

    #include <stdio.h>
    #include <stdlib.h>
    typedef int QDataType;
    typedef struct QueueNode
    {
        struct QueueNode* next;
        QDataType data;
    }QNode;
    typedef struct Queue
    {
        QNode* head; //队头指针
        QNode* tail; //队尾指针
    }Queue;
    
    void QueueInit(Queue** pQ) //队列初始化
    {
        (*pQ) = (Queue*)malloc(sizeof(Queue));
        (*pQ)->head = (*pQ)->tail = NULL;
    }
    void QueuePush(Queue* pQ, QDataType x) //入队 (尾插)
    {
        QNode* newnode = (QNode*)malloc(sizeof(QNode));
        newnode->data = x;
        newnode->next = NULL;
        if (pQ->tail == NULL)
            pQ->head = pQ->tail = newnode;
        else{
            pQ->tail->next = newnode;
            pQ->tail = newnode;
        }
    }
    void QueuePop(Queue* pQ)
    {
    
        if (!pQ->head){         //队空
            printf("invalid\n");
            return;
        }
        printf("%d\n",pQ->head->data);//输出出队元素
        if (pQ->head->next == NULL)    //1.只剩一个结点
        {
            free(pQ->head);
            pQ->head = pQ->tail = NULL;
        }
        else                       //2.多个结点
        {
            QNode* next = pQ->head->next;
            free(pQ->head);
            pQ->head = next;
        }
    }  
    int main()
    {
        QDataType i,n,flag,x;
        Queue *Q;
        QueueInit(&Q);
        scanf("%d", &n);
        while(n--){
            scanf("%d",&flag);
            if (flag == 1){
                scanf("%d", &x);
                QueuePush(Q, x);
            }
            else if (flag == 0){
                QueuePop(Q);
            }
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 修改了问题 4月1日
  • 创建了问题 4月1日

悬赏问题

  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加