数据结构之队列顺序表示与实现2

本文介绍了一种改进后的顺序队列实现方式,该方法在队列出队时无需大量移动元素,有效提高了效率。文中详细展示了队列的各种基本操作如初始化、销毁、清空、获取长度、获取队头元素、入队、出队等,并通过一个具体的C++程序实例进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

针对上一节队列顺序表示的缺点,做了少许改进,队列出队时无需大量移动元素


#include <iostream>
using namespace std;

#define QUEUE_INIT_SIZE 10
#define QUEUE_INCREMENT_SIZE 2

typedef int DataType;

struct SqQueue2
{
	DataType* base;
	int front;
	int rear;
	int queuesize;
};

//队列的初始化
bool SqQueue2Init(SqQueue2& Q)
{
	Q.base = (DataType*)malloc(sizeof(DataType));
	if (!Q.base)
	{
		cout << "malloc error" << endl;
		return false;
	}

	Q.front = Q.rear = 0;
	Q.queuesize = QUEUE_INIT_SIZE;
	return true;
}

//销毁队列
void SqQueue2Destroy(SqQueue2& Q)
{
	free(Q.base);
	Q.base = NULL;
	Q.front = Q.rear = 0;
	Q.queuesize = 0;
}

//清空队列
void SqQueue2Clear(SqQueue2& Q)
{
	Q.front = Q.rear = 0;
}
//获取队列长度
int SqQueue2Length(SqQueue2 Q)
{
	return(Q.rear - Q.front);
}
//获取队头
bool SqQueue2GetHead(SqQueue2 Q,DataType& e)
{
	if (Q.rear == Q.front)
		return false;

	e = Q.base[Q.front];
	return true;
}
//入队
bool SqQueue2Insert(SqQueue2& Q,DataType e)
{
	if (Q.rear >= Q.queuesize)
	{
		Q.base = (DataType*)realloc(Q.base, (Q.queuesize + QUEUE_INCREMENT_SIZE) * sizeof(DataType));
		if (!Q.base)
		{
			cout << "realloc error" << endl;
			return false;
		}

		Q.rear = Q.queuesize;
		Q.queuesize += QUEUE_INCREMENT_SIZE;
	}

	Q.base[Q.rear++] = e;
	return true;
}
//出队
bool SqQueue2Delete(SqQueue2& Q, DataType& e)
{
	if (Q.rear == Q.front)
		return false;
	e = Q.base[Q.front];
	Q.front++;

	return true;
}
//队列的遍历
void SqQueue2Traverse(SqQueue2 Q, void(*visit)(DataType))
{
	while (Q.front < Q.rear)
	{
		visit(Q.base[Q.front++]);
	}

	cout << endl;
}

void visit(DataType c)
{
	cout << " " << c;
}

void main()
{
	DataType e0;
	SqQueue2 Q;
	
	SqQueue2Init(Q);

	cout << "向队列中插入元素为:";
	for (int i = 1; i <= 5; i++)
	{
		SqQueue2Insert(Q,i);
	}
	SqQueue2Traverse(Q,visit);

	cout << "此时队列的长度为:" << SqQueue2Length(Q) << endl;

	SqQueue2GetHead(Q,e0);
	cout << "队列的队头为:" << e0 << endl;

	SqQueue2Delete(Q,e0);
	cout << "队头出队后,队列的长度为:" << SqQueue2Length(Q) << endl;
	cout << "队头出队后,队列元素为:";
	SqQueue2Traverse(Q,visit);

	SqQueue2Clear(Q);
	cout << "清空队列后,队列的长度为:" << SqQueue2Length(Q) << endl;

	system("pause");
}


由程序分析,尽管本程序在队列出队时不需要大量移动元素,但是当队列元素较多进行操作是比较浪费空间










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值