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

给定一个初始为空的队列和一系列入队、出队操作,请编写程序输出每次出队的元素。队列的元素值均为整数。
输入格式:
输入第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>
#define BOOL char
#define MAX 2000
#define true 1
#define false 0
typedef struct QNode *PtrToQNode;
struct QNode{
    int *Data;
    int f;
    int r;
    int Max;
};
typedef PtrToQNode Queue;
Queue CreatQueue(int Max);
BOOL AddQ(Queue Q,int X);
BOOL DeleteQ(Queue Q);
BOOL a();
int main(void){
    int i,n,flag,X;
    Queue Q;
    Q=CreatQueue(MAX);
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&flag);
        if(flag==1){
           scanf("%d",&X);
            if(a()){
            AddQ(Q,X);
            }
        }else if(flag==0){
            if(a()){
            DeleteQ(Q);
            }
        }
    }
    return 0;
}
Queue CreatQueue(int Max){
    Queue Q=(Queue)malloc(sizeof(struct QNode));
    Q->Data=(int *)malloc(Max*sizeof(int));
    Q->f=Q->r=0;
    Q->Max=Max;
    return Q;
}
BOOL AddQ(Queue Q,int X){
    if((Q->r+1)%Q->Max==Q->f){
        return false;
    }else{
        Q->r=(Q->r+1)%Q->Max;
        Q->Data[Q->r]=1;
        return true;
    }
}
BOOL DeleteQ(Queue Q){
    if(Q->r==Q->f){
        printf("invalid\n");
        return false;
    }else{
        printf("%d\n",Q->Data[Q->f]);
        Q->f=(Q->f+1)%Q->Max;
        return Q->Data[Q->f];
    }
}
BOOL a(){
    int num1,num2;
    if(num1>num2){
        return true;
    } else{
        return false;
    }
}

输出老是有问题,有人可以帮忙改改顺便讲一下改的地方吗?就用循环队列的那种,真的不会(T_T)

#include<iostream>
using namespace std;
typedef int QElemType;
typedef int SElemType;
typedef int Status;
#define Ok 1
#define Error 0 
//队列的链式存储结构 
typedef struct QNode{
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct {
    QueuePtr front; //队头指针 
    QueuePtr rear;  //队尾指针 
}LinkQueue;

 //链队的初始化 
Status InitQueue(LinkQueue &Q){
    //生成新结点作为头结点,队头和队尾指针指向此结点 
    Q.front = Q.rear=new QNode;
    //头结点的指针域为空 
    Q.front->next = NULL;
    return Ok;
}

//链队的入队
Status EnQueue(LinkQueue &Q,QElemType e){
    //插入元素e为Q的新的队尾元素
    //为入队元素分配结点空间,用指针P指向 
    QNode *p=new QNode;
    //新结点的数据域为e 
    p->data = e;
    //将新结点插入到队尾 
    p->next = NULL;
    //修改队尾指针 
    Q.rear->next = p;
    Q.rear = p;
    return Ok;
} 

//链队的出队
Status DeQueue(LinkQueue &Q,QElemType &e){
    //删除Q的队头元素,用e返回其值
    //若队列为空,则返回Error 
    if(Q.front==Q.rear) return Error;
    //p指向队头元素 
    QNode *p=Q.front->next;
    //e保存队头元素的值 
    e=p->data;
    //修改头结点的指针域 
    Q.front->next = p->next;
    //最后一个元素被删,队尾指针指向头结点 
    if(Q.rear == p) Q.rear =Q.front;
    //释放原队头元素的空间 
    delete p;
    return Ok; 
} 

//取链队的头元素
SElemType GetHead(LinkQueue Q){
    //返回Q的队头元素,不修改指针
    //队列非空 
    if(Q.front!=Q.rear){
        //返回队头元素的值,队头指针不变 
        return Q.front->next->data;
    } 
} 
 int main(){
    QElemType e;
    LinkQueue Q; 
    InitQueue(Q);
    int n,b;
    cin>>n;
    while(n-->0){
        cin>>b;
        if(b==1){
                cin>>b;
                EnQueue(Q,b);
        }
         if(b==0){
            if(Q.front==Q.rear)
                cout<<"invalid"<<endl;
            else{
                DeQueue(Q,b);
                cout<<b<<endl;
            }           
        }           
    }
    return 0;
 } 

```c++


```

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/1090014
  • 除此之外, 这篇博客: C与C++程序设计学习笔记中的 5、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的字符串来表示。例如:0010110011 就是可能的情况。你的任务是算出所有可能情况。每个答案占一行。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    int ti[11] = { 0 }; //用来存储每道题的回答情况0或者1,0表示错误,1表示正确
    //提醒:数组ti的编号实际用1-10
    //score表示当前得分,num是当前第num道题目
    void f(int score, int num)
    {
    	if (num == 11)//10道题目全部做完
    	{
    		if (score == 100)
    		{
    			int i = 0;
    			for (i = 1; i <= 10; i++)
    				printf("%d", ti[i]);
    			printf("\n");
    		}
    	}
    	else //10道题目没有做完
    	{
    		ti[num] = 1; //讨论第num道题目的正确情况
    		f(score * 2, num + 1);
    		ti[num] = 0; //讨论第num道题目的错误情况
    		f(score - num, num + 1);
    	}
    }
    int main(void)
    {
    	f(10, 1);//从基础分10分开始,从第1题开始
    	return 0;
    }