给定一个初始为空的队列和一系列入队、出队操作,请编写程序输出每次出队的元素。队列的元素值均为整数。
【输入格式】:
输入第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
#include
#define OVERFLOW 1
#define OK -1
#define ERROR 0
using namespace std;
typedef struct Qnode
{
int data;
struct Qnode *next;
}Qnode,*Queueptr;
typedef struct
{
Queueptr front;
Queueptr rear;
}LinkQueue;
int InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(Queueptr)malloc(sizeof(Qnode));
if(!Q.front)
exit(OVERFLOW);
Q.front=NULL;
return OK;
}
int EnQueue(LinkQueue &Q,int b)
{
Queueptr p;
p=(Queueptr)malloc(sizeof(Qnode));
p->data=b;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
int DeQueue(LinkQueue &Q)
{
if(Q.rear==Q.front)
cout<<"invalid"<next;
cout<data<next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
delete p;
return OK;
}
int main()
{
LinkQueue Q;
InitQueue(Q);
int n,a[100][100];
cin>>n;
for(int i=0;iint k=0;
cin>>a[i][k];
if(a[i][k]!=0)
{
k++;
cin>>a[i][k+1];
}
}
for(int j=0;jif(a[j][0]==1)
EnQueue(Q,a[j][1]);
else if(a[j][0]==0)
DeQueue(Q);
else
return ERROR;
}
return 0;
}
输出不了结果,该怎么修改?
修改如下,改动处见注释,供参考:
#include<iostream>
#include<malloc.h>
#define OVERFLOW 1
#define OK -1
#define ERROR 0
using namespace std;
typedef struct Qnode
{
int data;
struct Qnode *next;
}Qnode,*Queueptr;
typedef struct
{
Queueptr front; //队头指针
Queueptr rear; //队尾指针
}LinkQueue;
int InitQueue(LinkQueue &Q)
{
//Q.front=Q.rear=(Queueptr)malloc(sizeof(Qnode)); 修改
//if(!Q.front) 修改
// exit(OVERFLOW); 修改
Q.front = Q.rear = NULL;
return OK;
}
int EnQueue(LinkQueue &Q,int b)
{
Queueptr p;
p=(Queueptr)malloc(sizeof(Qnode));
p->data=b;
p->next=NULL;
if (!Q.rear) //修改
Q.front = Q.rear = p; //修改
else{ //修改
Q.rear->next=p;
Q.rear = p;
}
return OK;
}
int DeQueue(LinkQueue &Q)
{
if (!Q.front){ //if(Q.rear==Q.front)修改
cout<<"invalid"<<endl;
return ERROR; //修改
}
//Queueptr p; 修改
//p=Q.front->next; 修改
cout<<Q.front->data<<endl; //cout<<p->data<<endl;修改
//Q.front->next=p->next;
if (Q.front->next == NULL){//只剩一个结点
free(Q.front);
Q.front = Q.rear = NULL;
}
else { //if(Q.rear==p) //多个结点
Queueptr p = Q.front->next;
free(Q.front); //Q.rear=Q.front; 修改
Q.front = p;
}
//delete p; 修改
return OK;
}
int main()
{
LinkQueue Q;
InitQueue(Q);
int n,a[100][2]={0}; //修改
cin>>n;
for(int i=0;i<n;i++)
{
int k=0;
cin>>a[i][k];
if(a[i][k]!=0)
{
//k++; 修改
cin>>a[i][k+1];
}
}
for(int j=0;j<n;j++)
{
if(a[j][0]==1)
EnQueue(Q,a[j][1]);
else if(a[j][0]==0)
DeQueue(Q);
// else 修改
// return ERROR;修改
}
return 0;
}
#include <stdio.h>
#define MAX_SIZE 20000
int queue[MAX_SIZE]; // 定义队列数组
int front = 0, rear = 0; // 初始化队头和队尾指针
int main() {
int n;
scanf("%d", &n); // 输入操作个数
while (n--) {
int op, d;
scanf("%d", &op);
if (op == 1) { // 入队操作
scanf("%d", &d);
queue[rear++] = d;
} else { // 出队操作
if (front == rear) {
printf("invalid\n");
} else {
printf("%d\n", queue[front++]);
}
}
}
return 0;
}
注释说明:
MAX_SIZE 定义了队列数组的最大容量;
queue 数组用于存储队列元素;
front 和 rear 分别代表队列的队头和队尾指针,初始化时都指向数组第一个位置;
main() 函数中首先输入操作个数 n;
然后每次循环读入一条操作,如果是入队操作就将元素存入队尾;如果是出队操作就输出队头元素,并将队头指针加一;
如果在出队操作时队列为空,则输出 "invalid"。
不知道你这个问题是否已经解决, 如果还没有解决的话:/*
后宫选妃系统
六大模块:
1.下旨选妃 -完成
输入一名新妃子的名字,新增加一位新的妃子,然后其他妃子的宠爱度减 10 点
2.翻牌宠幸-完成
输入一名妃子的名字,翻牌宠幸其,增加其宠爱度10点,减少其他妃子宠爱度10点
3.打入冷宫-完成
输入一名妃子的名字,删除一位妃子,然后其他所有的妃子宠爱度加 10 点,若无此人则显示虚惊一场
4.朕的爱妃呢-完成
查找妃子,输入妃子的姓名并显示基本信息,被选中的妃子宠幸度加 10 点.其他妃子宠爱度减10点
5.巡视后宫-完成
巡视后宫,显示所有在宫妃子信息
6.游戏规则判定-未
妃子等级制(始皇制):
一后
三夫人
九嫔
二十七世妇
八十一御女
游戏规则:1.若有三名妃子宠爱度处于50以下则发生暴动,游戏结束
2.若有人宠爱度达到100,镇压后宫,游戏结束
3.每名妃子默认宠爱度70点
*/
#include <stdio.h>
#include <string.h>
typedef struct concubine
{
char name[10]; //名字,最多十个字符
int level; //后宫等级
int likability; //宠爱度
} concu;
//函数声明
int addOne(concu *ptca, int *num);
int chooseOne(concu *ptca, int *num);
int forsakeOne(concu *ptca, int *num);
int findOne(concu *ptca, int *num);
void seeAll(concu *ptca, int *num);
int judege_1(concu *ptca, int *num);
int judege_2(concu *ptca, int *num);
// 游戏规则判断计数器1 冷宫总人数
int count = 0, leave = 0; //初始化总比不初始化好
int main(void)
{
//存储conu的(X可变长)数组
concu concus[31];
int n = 0, *num = &n; //存储后宫妃子总数,使用指针方便更改!数字指针定义时需要&取地址
concu *p;
//后宫初始化,默认有三位妃子
concu c1 = {"刘解忧", 1, 70};
concu c2 = {"孙尚香", 1, 70};
concu c3 = {"鱼幼薇", 1, 70};
concus[0] = c1;
concus[1] = c2;
concus[2] = c3;
*num = 3;
//选妃系统界面控制
int c, d; //控制,循环控制界面
while (d)
{
p = concus; //初始化指针
printf("-------后宫选妃系统-------\n\
四大模块:\n\
1.下旨选妃\n\
2.翻牌宠幸\n\
3.打入冷宫\n\
4.朕的爱妃呢\n\
5.后宫巡视\n\
6.退出选妃系统\n\
请输入序号选择功能:\n");
scanf("%d", &c);
switch (c)
{
case 1:
// printf("1\n");
addOne(p, num); //函数1
printf("输入任意键以继续.....\n");
scanf("%d", &c);
break;
case 2:
// printf("2");
chooseOne(p, num); //函数2
printf("输入任意键以继续.....\n");
scanf("%d", &c);
break;
case 3:
// printf("3");
forsakeOne(p, num); //函数3
printf("输入任意键以继续.....\n");
scanf("%d", &c);
break;
case 4:
// printf("4");
findOne(p, num); //函数4
printf("输入任意键以继续.....\n");
scanf("%d", &c);
break;
case 5:
// printf("5");
seeAll(p, num); //函数5
printf("输入任意键以继续.....\n");
scanf("%d", &c);
break;
case 6:
printf("退出成功...\n");
c = 0;
break;
default:
printf("小主,查无此功能啊!\n");
printf("输入任意键以继续.....\n");
scanf("%d", &c);
break;
}
d = judege_1(p, num) && judege_2(p, num);
if (d == 0)
{
printf("后宫暴动,游戏失败!");
printf("输入任意键以退出.....\n");
scanf("%d", &c);
}
}
}
//1.下旨选妃-输入一名新妃子的名字,新增加一位新的妃子,然后其他妃子的宠爱度减 10 点
int addOne(concu *ptca, int *num)
{
//根据输入初始化一位妃子的信息
char ch[10];
int lev;
printf("请输入妃子姓名,等级(1-5)(空号间隔):\n");
scanf("%s %d", ch, &lev);
concu c;
strcpy(c.name, ch);
c.level = lev;
c.likability = 70;
int n = *num; //临时数量控制器,操纵循环
//使用遍历完成下旨选妃中的操作
concu *p = ptca;
for (int i = 0; i < n + 1; i++)
{
if (strcmp(p->name, ch) == 0)
{
printf("皇上,%s已经在宫中了呢!\n", ch);
return 0;
}
p++;
}
for (int i = 0; i < n + 1; i++)
{
if (i < *num)
{
ptca->likability -= 10;
ptca++;
}
else
{
*ptca = c;
*num += 1; //总数加一
printf("恭喜选妃成功;妃子信息:姓名:%s,等级:%d,宠爱度:%d\n", ptca->name, ptca->level, ptca->likability);
// printf("当前后宫总人数:%d\n", *num);
}
}
}
//2.翻牌宠幸-输入一名妃子的名字,翻牌宠幸其,增加其宠爱度10点,减少其他妃子宠爱度10点
int chooseOne(concu *ptca, int *num)
{
int n = *num; //临时变量,控制循环
char a_name[10];
//准备翻牌
printf("皇上,可以翻牌了呢,输入想翻牌的妃子名字即可:\n");
scanf("%s", a_name);
// gets(name);
// printf("1");
// int i = 0;
printf("当前即将被翻牌的妃子名称是 %s ...\n", a_name);
//判断是否在宫中
concu *p = ptca;
int a_count = 0; //不同名妃子计数器
for (int i = 0; i < n; i++)
{
// printf("%s --- %s\n", p->name, a_name);
if (strcmp(p->name, a_name) != 0)
{
a_count++;
}
// printf("%d\n", a_count);
p++;
}
if (a_count == n)
{
printf(" %s 还不在宫中呢...\n", a_name);
return 0;
}
printf("\n");
for (int i = 0; i < n; i++)
{
if ((strcmp(a_name, (ptca->name)) == 0)) //判断名字是否相等,相等返回0
{
ptca->likability += 10;
printf(" %s 翻牌成功!\n", ptca->name);
}
else
{
ptca->likability -= 10;
printf("后宫徒生嫉妒, %s 宠爱度减少10点!\n", ptca->name);
}
ptca++; //指针指向下一个结构体
}
};
//3.打入冷宫-输入一名妃子的名字,删除一位妃子,然后其他所有的妃子宠爱度加 10 点,若无此人则显示虚惊一场
int forsakeOne(concu *ptca, int *num)
{
int n = *num; //临时变量,控制循环
char a_name[10];
concu c;
strcpy(c.name, "0");
c.level = 0;
c.likability = 0;
//准备翻牌
printf("皇上,您要抛弃哪位妃子呢,输入妃子名字即可:\n");
scanf("%s", a_name);
// gets(name);
// printf("1");
int i = 0;
printf("当前即将被即将被打入冷宫的妃子名称是 %s ...", a_name);
//判断是否在宫中
concu *p = ptca;
int a_count = 0; //不同名妃子计数器
for (int i = 0; i < n; i++)
{
// printf("%s --- %s\n", p->name, a_name);
if (strcmp(p->name, a_name) != 0)
{
a_count++;
}
// printf("%d\n", a_count);
p++;
}
if (a_count == n)
{
printf(" %s 还不在宫中呢...\n", a_name);
return 0;
}
printf("\n");
for (int i = 0; i < n; i++)
{
if ((strcmp(a_name, (ptca->name)) == 0)) //判断名字是否相等,相等返回0
{
*ptca = c;
}
else
{
ptca->likability += 10;
printf("因 %s 被打入冷宫, %s宠爱度增加10点!\n", a_name, ptca->name);
}
ptca++; //指针指向下一个结构体
}
};
//4.朕的爱妃呢-查找妃子,输入妃子的姓名并显示基本信息,被选中的妃子宠幸度加 10 点.其他妃子宠爱度减10点
int findOne(concu *ptca, int *num)
{
int n = *num; //临时变量,控制循环
char a_name[10];
printf("皇上您要查找哪一位妃子呢,输入名字即可:\n");
scanf("%s", a_name);
printf("当前要查找的妃子是%s....\n", a_name);
//判断是否在宫中
concu *p = ptca;
int a_count = 0; //不同名妃子计数器
for (int i = 0; i < n; i++)
{
// printf("%s --- %s\n", p->name, a_name);
if (strcmp(p->name, a_name) != 0)
{
a_count++;
}
// printf("%d\n", a_count);
p++;
}
if (a_count == n)
{
printf(" %s 还不在宫中呢...\n", a_name);
return 0;
}
//在遍历中寻找符合要求的妃子并打印信息
for (int i = 0; i < n; i++)
{
if ((strcmp(a_name, (ptca->name)) == 0))
{
printf("姓名\t等级\t宠爱度\t\n");
printf("%s\t", ptca->name);
//打印等级,并用中文替代
switch (ptca->level)
{
case 1:
printf("御女\t");
break;
case 2:
printf("世妇\t");
break;
case 3:
printf("嫔\t");
break;
case 4:
printf("夫人\t");
break;
case 5:
printf("后\t");
break;
default:
printf("0\t");
break;
}
//打印宠爱度
printf("%d\n", ptca->likability);
}
ptca++;
}
};
//5.巡视后宫,打印所有妃子信息,跳过被打入冷宫的妃子信息
void seeAll(concu *ptca, int *num)
{
int n = *num; //临时变量控制循环
printf("-----------------------------------------\n");
printf("姓名\t等级\t宠爱度\t\n");
for (int i = 0; i < n; i++)
{
if (ptca->level != 0)
{
//打印姓名
printf("%s\t", ptca->name);
//打印等级,并用中文替代
switch (ptca->level)
{
case 1:
printf("御女\t");
break;
case 2:
printf("世妇\t");
break;
case 3:
printf("嫔\t");
break;
case 4:
printf("夫人\t");
break;
case 5:
printf("后\t");
break;
default:
printf("0");
break;
}
//打印宠爱度
printf("%d\n", ptca->likability);
}
ptca++;
}
};
//6.1.若有三名妃子宠爱度处于50以下则发生暴动,游戏结束
int judege_1(concu *ptca, int *num)
{
int n = *num; //临时变量,控制循环
count = 0; //计数器清0
//循环 计数器
for (int i = 0; i < n; i++)
{
if (ptca->likability < 50)
{
count++;
}
}
//判断
if (count >= 3)
{
return 0;
}
else
{
return 1;
}
}
//6.2.若有人宠爱度达到100,镇压后宫,游戏结束
int judege_2(concu *ptca, int *num)
{
int n = *num; //临时变量,控制循环
//循环 计数器
for (int i = 0; i < n; i++)
{
if (ptca->likability >= 100)
{
return 0;
}
}
return 1;
}