数据结构——顺序队列

顺序队列特性:

允许插入的一端叫队尾,O(1)
允许删除的一端叫队头,O(n)
如果把顺序队列设计成循环队列,可以把删除操作变为O(1)
先进先出,后进后出

结构体

typedef struct SqQueue
{
	int front;//队头
	int rear;//队尾下标,同“栈”的"top"指针,指向当前可以存放的结点
	int *base;
	int queue_size;//如果要扩容,则需要加入这个成员
}SqQueue,*PSqQueue;

初始化

void InitQueue(PSqQueue pq)//初始化
{
	assert(pq != NULL);
	pq->front = 0;
	pq->rear = 0;
	pq->base = (int*)malloc(sizeof(int) * N);
	assert(pq->base != NULL);	
}

判满

static bool IsFull(PSqQueue pq)
{
	return (pq->rear + 1) % N == pq->front;
}

入队

bool Push(PSqQueue pq, int val)//入队
{
	//浪费一个格子来判断 队列是否满员
	assert(pq != NULL);
	//判满
	if (IsFull(pq))
	{
		return false;
	}
	//填入数据
	pq->base[pq->rear] = val;
	//移动尾指针,注意是环
	pq->rear=(pq->rear + 1)%N;
	return true;
}

判空

bool IsEmpty(PSqQueue pq)//判空
{
	assert(pq != NULL);
	return pq->rear == pq->front;
}

获取队头元素的值,不删除

bool GetTopData(PSqQueue pq, int* rtval)//获取队头元素的值,不删除
{
	assert(pq != NULL);
	if (pq == NULL)
	{
		return false;
	}

	if (IsEmpty(pq))
	{
		return false;
	}

	*rtval = pq->base[pq->front];
	return true;
}

获取队头元素的值,删除

bool Pop(PSqQueue pq, int* rtval)//获取队头元素的值,删除
{
	assert(pq != NULL);
	if (pq == NULL)
	{
		return false;
	}
	*rtval = pq->base[pq->front];
	pq->front = (pq->front+1) % N;
	return true;
}

获取长度

int GetLength(PSqQueue pq)//获取栈里个数
{
	return (pq->rear - pq->front + N) % N;
}

销毁

void Destory(PSqQueue pq)
{
	//我的想法:
	/*assert(pq != NULL);
	while (!IsEmpty(pq))
	{
		pq->front = (pq->front + 1) % N;
	}*/
	
	assert(pq != NULL);
	if (pq == NULL)
	{
		return;
	}
	free(pq->base);
	pq->front = 0;
	pq->rear = 0;
}

输出

void Show(PSqQueue pq)
{
	assert(pq != NULL);
	for (int i = pq->front; i < GetLength(pq); i++)
	{
		printf("%d ", pq->base[i]);
	}
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值