leetcode 622.设计循环队列

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。

这里使用数组来实现循环队列。

//CircularQueue.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int CQDataType;

typedef struct
{
	CQDataType* pc;
	int front;
	int tail;
	int k;
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k);

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value);

bool myCircularQueueDeQueue(MyCircularQueue* obj);

int myCircularQueueFront(MyCircularQueue* obj);

int myCircularQueueRear(MyCircularQueue* obj);

bool myCircularQueueIsEmpty(MyCircularQueue* obj);

bool myCircularQueueIsFull(MyCircularQueue* obj);

void myCircularQueueFree(MyCircularQueue* obj);

//CircularQueue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "CircularQueue.h"

MyCircularQueue* myCircularQueueCreate(int k) 
{
	MyCircularQueue* q = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
	if (q == NULL)
	{
		exit(-1);
	}
	CQDataType* tmp = (CQDataType*)malloc((k + 1) * sizeof(CQDataType));
	if (tmp == NULL)
	{
		exit(-1);
	}

	q->k = k;
	q->pc = tmp;
	q->front = q->tail = 0;

	return q;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) 
{
	assert(obj != NULL);
	if (myCircularQueueIsFull(obj))
	{
		return false;
	}

	//入队
	(obj->pc)[obj->tail] = value;
	
	//判断是否满了
	//if (!myCircularQueueIsFull(obj))
	//{
	//	//没满
	//	if (obj->tail == obj->k)
	//	{
	//		obj->tail = 0;
	//	}
	//	else
	//	{
	//		obj->tail++;
	//	}
	//}	
	
	++obj->tail;
	obj->tail %= (obj->k + 1);
	return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj)
{
	assert(obj);
	//assert(!myCircularQueueIsEmpty(obj));

	if (myCircularQueueIsEmpty(obj))
	{
		return false;
	}

	/*if (obj->front == obj->k)
	{
		obj->front = 0;
	}
	else
	{
		obj->front++;
	}*/
	
	obj->front++;
	obj->front %= (obj->k+1);
	return true;
}

int myCircularQueueFront(MyCircularQueue* obj) 
{
	assert(obj);

	//if (myCircularQueueIsEmpty(obj))
	//{
	//	return -1;
	//}

	//return obj->pc[obj->front];

	return myCircularQueueIsEmpty(obj)?-1: obj->pc[obj->front];
}

int myCircularQueueRear(MyCircularQueue* obj)
{
	assert(obj);

	if (myCircularQueueIsEmpty(obj))
	{
		return -1;
	}
	else
	{
		if (obj->tail == 0)
		{
			return obj->pc[obj->k];
		}
		else
		{
			return obj->pc[obj->tail - 1];
		}		
	}
}

//int myCircularQueueRear(MyCircularQueue* obj)
//{
//	assert(obj);
//
//	if (myCircularQueueIsEmpty(obj))
//	{
//		return -1;
//	}
//	int i = (obj->tail + obj->k) % (obj->k + 1);
//	return obj->pc[i];
//}


bool myCircularQueueIsEmpty(MyCircularQueue* obj) 
{
	assert(obj);

	return obj->front == obj->tail;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) 
{
	assert(obj);
	return (obj->tail + 1) % (obj->k + 1) == obj->front;
}

void myCircularQueueFree(MyCircularQueue* obj) 
{
	free(obj->pc);
	obj->pc = NULL;
	free(obj);
	obj = NULL;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于LeetCode上的问题994.腐烂的橘子,你可以使用Python来解决。下面是一个示例代码: ```python from collections import deque def orangesRotting(grid): # 记录网格的行数和列数 row, col = len(grid), len(grid[0]) # 定义四个方向:上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 使用队列来保存腐烂的橘子的位置 queue = deque() # 记录新鲜橘子的数量 fresh_count = 0 # 遍历整个网格,初始化队列和新鲜橘子的数量 for i in range(row): for j in range(col): if grid[i][j] == 2: # 腐烂的橘子 queue.append((i, j)) elif grid[i][j] == 1: # 新鲜橘子 fresh_count += 1 # 如果新鲜橘子的数量为0,直接返回0 if fresh_count == 0: return 0 # 初始化分钟数 minutes = 0 # 开始进行BFS,直到队列为空 while queue: # 记录当前分钟数下,队列中的元素数量 size = len(queue) # 遍历当前分钟数下的所有腐烂的橘子 for _ in range(size): x, y = queue.popleft() # 遍历四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy # 判断新位置是否在网格内,并且是新鲜橘子 if 0 <= nx < row and 0 <= ny < col and grid[nx][ny] == 1: # 将新鲜橘子变为腐烂状态 grid[nx][ny] = 2 # 将新鲜橘子的位置加入队列 queue.append((nx, ny)) # 新鲜橘子的数量减1 fresh_count -= 1 # 如果当前分钟数下,没有新鲜橘子了,结束循环 if fresh_count == 0: break # 每遍历完一层,分钟数加1 minutes += 1 # 如果最后还有新鲜橘子,返回-1,否则返回分钟数 return -1 if fresh_count > 0 else minutes ``` 你可以将给定的网格作为参数传递给`orangesRotting`函数来测试它。请注意,该代码使用了BFS算法来遍历橘子,并计算腐烂的分钟数。希望能对你有所帮助!如果有任何疑问,请随时问我。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值