队列的相关操作

队列的相关操作

(1)建立整型队列类

公用成员:

1)初始化

2)输出(成员函数)={“队列长度”;队列元素(下标从0到(队列长度-1),依次输出)}

2)获取当前队列长度(成员函数)

3)入队(成员函数)

4)出队(成员函数)【难点1:front = (front + 1) % N;//为什么要模N取余?】

5)判空(成员函数)

6)判满(成员函数)

7)获取队头元素(成员函数)【难点2-1:参数设为整型指针变量value?结合操作如何理解?】

8)销毁队列空间(成员函数)【难点3:队列的指针空间销毁后为什么还有两步操作,如何理解?】

私有成员:

1)数组地址(成员属性-整型值)

2)队列头下标(成员属性-整型值)

3)队列尾下标(成员属性-整型值)

(2)主函数

1)创建整型队列对象;

调用整型队列类的成员函数,初始化整型队列对象;

输出(当前队列长度,(队列长度不为0时输出)当前队列元素值)

2)将元素插入队列(下标为0~9)

输出(当前队列长度,当前队列元素值)

3)定义value变量,数据类型设为整型

逐个删除队列元素(出队)

输出(当前队列长度,当前队列元素值)

4)获取队头元素(引用value)【难点2-2:引用与指针的用法】

输出队头元素的值

判断队列为空还是为满

输出(当前队列长度,当前队列元素值)

5)销毁队列空间

判断队列是否为空

输出(当前队列长度,当前队列元素值)

(3)程序代码

#include <iostream>
#define N 100
using namespace std;

//建立整型队列类
class SetQueue {
public:
	//初始化
	void Init()
	{
		data = new int[N];
		rear = front = N - 2;
	}
	//输出
	void Output()
	{
		cout << "队列长度为:" << Getlen() << endl;
		if (rear != front){
			//for (int i = (front + 1); i <= rear; i++)//这句话有问题
			for (int i = 0; i < Getlen(); i++)//打印下标从0~(队列长度-1)的数
				cout << data[(front + 1 + i) % N] << ',';
			cout << endl;
		}
	}
	//获取当前队列长度
	int Getlen()
	{
		return (rear - front + N) % N;
	}
	//入队
	void Insert(int value) //为什么这里value不要加*?
	{
		rear = (rear + 1) % N;
		data[rear] = value;//答:这里value只是起内在赋值作用,故不要加指针
	}
	//出队
	void Delete(int *value) 
	{	
		if (front != rear) {
			front = (front + 1) % N;
			*value = data[front];
		}
	}
	//判空
	bool IsEmpty()
	{
		return (rear == front) ? true : false;
	}
	//判满
	bool IsFull()
	{
		return ((front + 1) % N == rear) ? true : false;
	}
	//获取队头元素
	void Put(int* value)
	{
		if (rear != front)
			*value = data[(front + 1) % N];
	}
	//销毁队列空间
	void Destroy()
	{
		delete[]data;//?
		rear = front = N - 2;
		data = NULL;
		cout << "队列销毁成功" << endl;
	}

private:
	int* data;//储存数组地址
	int front;//队列头的下标
	int rear;//队列尾的下标
};

int main()
{
	SetQueue MyQueue;
	MyQueue.Init();
	MyQueue.Output();

	for (int i = 0; i < 10; i++)//输出MyQueue中下标为0~9的数
		MyQueue.Insert(i + 1);
	MyQueue.Output();

	int value; 
	for (int i = 0; i < 5; i++) {
		MyQueue.Delete(&value);
		cout << "出队元素:" << value << endl;
	}
	MyQueue.Output();

	MyQueue.Put(&value);
	cout << "队头元素为:" << value << endl;
	if (MyQueue.IsEmpty())
		cout << "队列为空" << endl;
	else
		cout << "队列不为空" << endl;
	if (MyQueue.IsFull())
		cout << "队列已满" << endl;
	else
		cout << "队列不为满" << endl;
	MyQueue.Output();

	MyQueue.Destroy();
	if (MyQueue.IsEmpty())
		cout << "队列为空" << endl;
	else
		cout << "队列不为空" << endl;
	MyQueue.Output();

	return 0;
}

(4)难点求解

【难点1:front = (front + 1) % N;//为什么要模N取余?】

【难点2-1:参数设为整型指针变量value?结合操作如何理解?】

【难点2-2:引用与指针的用法】

【难点3:队列的指针空间销毁后为什么还有两步操作,如何理解?】

上面的几个难点希望有人能给出解答,分享交流。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值