题目描述:
大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有5条指令:
(1) Push K, 让元素K进队列。
(2) Pop,对头元素出队列。
(3) Query K,查找队列中第K个元素,注意K的合法性。
(4) Isempty,判断队列是否为空。
(5) Isfull,判断队列是否已满。
现在有N行指令,并且告诉你队列大小是M。
输入:
第一行包含两个整数N和M。1<=N,M<=100000。
接下来有N行,表示指令,指令格式见题目描述。
其中元素均在int范围。
输出:
对于指令(1),若队列已满,输出failed,否则不做输出。
对于指令(2),若队列已空,输出failed,否则不做输出。
对于指令(3),输出队列中第K个元素,若不存在,输出failed。
对于指令(4)和(5),则用yes或者no回答。
详情见样例。
样例输入:
12 2Push 1Push 2Push 3Query 2Query 3IsemptyIsfullPopPopPopIsemptyIsfull
样例输出:
failed2failednoyesfailedyesno
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define queuesize 100001 //最大队列长度
struct queue
{
int front;
int rear;
int data[queuesize];
int count; //记录队列中的元素
};
void InitQueue(struct queue *Q);
void EnQueue(struct queue *Q, int element, int m);
void Dequeue(struct queue *Q, int m);
void QueueSearch(struct queue *Q, int k, int m);
int main()
{
int n, m, i, element, k, flag;
char command[10];
while(scanf("%d%d",&n, &m) != EOF)
{
if(n < 1 || m > 100000)
return 0;
struct queue *Q;
Q = malloc(sizeof(struct queue));
InitQueue(Q);
for(i = 0; i < n; i ++)
{
scanf("%s",command);
if (strcmp(command,"Push") == 0)
{
scanf("%d",&element);
EnQueue(Q, element, m);
}else if (strcmp(command,"Pop") == 0)
{
Dequeue(Q, m);
}else if (strcmp(command,"Query") == 0)
{
scanf("%d",&k);
QueueSearch(Q, k, m);
}else if (strcmp(command,"Isempty") == 0)
{
flag = (Q -> count == 0)? 1 : 0;
if(flag)
{
printf("yes\n");
}else
{
printf("no\n");
}
}else if (strcmp(command,"Isfull") == 0)
{
flag = (Q -> count == m)? 1 : 0;
if(flag)
{
printf("yes\n");
}else
{
printf("no\n");
}
}
}
}
return 0;
}
/**
* Description:队列初始化
*/
void InitQueue(struct queue *Q)
{
Q -> front = Q -> rear = 0;
Q -> count = 0;
}
/**
* Description:入队操作
*/
void EnQueue(struct queue *Q, int element, int m)
{
int flag;
flag = (Q -> count == m)? 1 : 0;
if(!flag)
{
Q -> data[Q -> rear] = element;
Q -> count ++;
Q -> rear = (Q -> rear + 1) % m;
}else
{
printf("failed\n");
}
}
/**
* Description:出队操作
*/
void Dequeue(struct queue *Q, int m)
{
int flag;
int element;
flag = (Q -> count == 0)? 1 : 0;
if(!flag)
{
element = Q -> data[Q -> front];
Q -> front = (Q -> front + 1) % m;
Q -> count --;
}else
{
printf("failed\n");
}
}
/**
* Description:查找队列中的指定元素
*/
void QueueSearch(struct queue *Q, int k, int m)
{
int flag, temp;
flag = (Q -> count == 0)? 1: 0;
temp = Q -> front + k - 1;
if((!flag) && (k <= m && k >= 1))
{
if((Q -> front < Q -> rear) && ( Q-> front <= temp && Q -> rear > temp))
printf("%d\n",Q -> data[temp]);
else if((Q -> front > Q -> rear) && (temp >= Q -> front || temp < Q->rear))
printf("%d\n",Q -> data[temp]);
else if(Q -> front == Q -> rear)
printf("%d\n",Q -> data[temp]);
else
printf("failed\n");
}else
{
printf("failed\n");
}
}
您可能感兴趣的文章:C语言 数据结构中求解迷宫问题实现方法C++ 自定义栈实现迷宫求解C++ 迷宫游戏实现代码使用C/C++语言生成一个随机迷宫游戏C++实现随机生成迷宫地牢C++实现迷宫算法实例解析C语言循环队列的表示与实现实例详解C语言单链队列的表示与实现实例详解优先队列(priority_queue)的C语言实现代码深入浅析C语言中堆栈和队列详解数据结构C语言实现之循环队列C语言使用广度优先搜索算法解决迷宫问题(队列)