给定一个初始为空的队列和一系列入队、出队操作,请编写程序输出每次出队的元素。队列的元素值均为整数。
输入格式:
输入第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;
}
}
对队列不太熟悉,希望有人能帮忙揪揪错,如果可以的请具体说说错误的地方,具体要怎么改呢?咳,希望可以讲的简单易懂一点(^ω^)
供参考:
#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;
}
#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;
}