c语言下循环队列的使用,使用C语言来解决循环队列问题的方法

题目描述:

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

#include

#include

#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
    评论
好的,下面是 C 语言实现循环队列的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define QUEUE_SIZE 5 // 队列的最大容量 typedef struct { int *data; // 存储队列元素的数组指针 int front; // 队头指针 int rear; // 队尾指针 } Queue; // 初始化队列 void initQueue(Queue *queue) { queue->data = (int*)malloc(sizeof(int) * QUEUE_SIZE); queue->front = queue->rear = 0; } // 判断队列是否为空 int isEmpty(Queue *queue) { return queue->front == queue->rear; } // 判断队列是否已满 int isFull(Queue *queue) { return (queue->rear + 1) % QUEUE_SIZE == queue->front; } // 入队操作 int enqueue(Queue *queue, int value) { if (isFull(queue)) { printf("Queue is full!\n"); return 0; } queue->data[queue->rear] = value; queue->rear = (queue->rear + 1) % QUEUE_SIZE; return 1; } // 出队操作 int dequeue(Queue *queue, int *value) { if (isEmpty(queue)) { printf("Queue is empty!\n"); return 0; } *value = queue->data[queue->front]; queue->front = (queue->front + 1) % QUEUE_SIZE; return 1; } int main() { Queue queue; initQueue(&queue); // 入队操作 enqueue(&queue, 1); enqueue(&queue, 2); enqueue(&queue, 3); // 出队操作 int value; dequeue(&queue, &value); printf("Dequeued value: %d\n", value); // 再次入队 enqueue(&queue, 4); // 打印队列中的元素 while (!isEmpty(&queue)) { dequeue(&queue, &value); printf("%d ", value); } printf("\n"); return 0; } ``` 以上代码实现了循环队列的基本操作,包括入队、出队、判断队列是否为空或已满等。需要注意的是,在循环队列中,队头和队尾指针的更新需要采用取模运算,以保证队列的循环使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值