不一样的循环队列

起因

在九度ac了一道还算不错的队列题目,记录一下,数组实现的循环队列

题目描述:

大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有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");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值