队列的相关操作
(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:队列的指针空间销毁后为什么还有两步操作,如何理解?】
上面的几个难点希望有人能给出解答,分享交流。