“队列里的那个元素没了”就是出队的意义啊...老师设了一个参数e的意义在于让我们知道程序删除的元素对不对而已,也可以不设置这个e
老师我懂了,我们是用数组定义的循环队列,m_iqueue是数组下标,所以指针要做++操作,而课本上面的循环队列不一定是数组实现的
函数传参没问题,测试代码部分没有?
不是这样不成死循环了嘛
链表不能用下标来遍历,队列既能用数组来实现,也能用链表来实现,用链表时就不能这样取下标来遍历,但是可以通过指针来遍历
本节插入元素是int类型,只需要关注int 类型的值,所以使用不带&的类型将int的值传入。
出列是为了获取队列中的值,我们调用函数获得调用函数内部的计算结果有三种方式:返回值,指针,引用,本节用的是引用,即&,我们也可以使用指针或者返回值去获取函数内部的结算结果。
你是用的VS2017吗?如果是的话需要设置一些东西,工具栏->调试->选项(O)->常规->勾选:启用资源服务器文件->符号->勾选:Microsoft符号服务器。
因为这里编写的win32程序和平台64位不兼容,你可以试一下
还有,要仔细检查一下自己的拼写是不是有问题哦
他要将从队列中删除的数记录下来,要用引用才能从局部的方法中将这个值记录到外部。不是引用的话这个值在方法结束时自动清除掉了,起不到记录的作用。
首先,下标改成了 i%m_iQueueCapacity,其次,i只是一个整数,本身不存在越界问题。由于在下标中取余了,所以永远访问的是m_iQueueCapacity长度的数组,一直循环,不会越界。
因为m_iQueueLen表示的是队列的长度,在不断地发生变化。m_iQueueCapacity是用户输入的一个固定的值。
个人理解是可以有的,如果一个队列装满了,那队尾指的就是最后一个元素
数组容量是固定的大小,而元素的个数不是固定的,这个是要输出含有的元素
delete []m_pQueue的意思是释放m_pQueue所指向的那块内存。
对指针不是很了解的话,建议先去看一下《Linux C语言指针与内存》这门课https://www.imooc.com/learn/394
如果对C/C++不是很熟悉的话,建议先去补一下相关知识,再去看数据结构,慕课网有C和C++的基础课程可以学习
因为这里只用m_iHead++就可以实现首位的删除了,要将首位输出的话,必须定义一个引用,然后将首位赋值给引用,把值传出来即可,element没必要为参数,他只需要传出首位的值就可以,参数会出现赋值的错误。
有一种情况是例外。当队列只包含一个元素,队头和队尾也一样。所以,判断长度更为保险。代码如下:
老师的代码
int e = 0;
p->DeQueue(e);
cout << endl;
cout << e << endl;
可以看出,当对队尾删除的时候,就将值付给e了,因为要删除的值没有必要进行额外存储,所以一般只保留最近被删除的数,你也可以再将它存到其他的数组中。
另外关于数组从0开始的,没有问题。 老师在构造函数的时候,已经把m_tial初始化为0了,所以不需要tail-1
希望有所帮助。
长度是一个变化的值,容量决定队列循环的有几个元素,同m_Head与m_Tail一样,i 对容量求模
对啊,head往后挪了一个,这个地方以后Tail就可以用了啊,没必要把它变成0吧。
element只是为了方便你看操作而已
遍历应该是
for (int i = m_iHead; i < m_iQueueLen + m_iHead; i++)
{
cout << m_pQueue[i % m_iQueueCapacity] << endl;
}
bool MyQueue::DeQueue(int &element)传入引用是为了可以直接修改实参的值,
bool MyQueue::EnQueue(int element)只是将实参的值传递给形参
例如:int e = 0;p->DeQueue(e);本来e的值是0,将e的引用传递之后,就可以通过此时队列头部的数据将e修改为一样的数据
敬请观看下一节视频
传入的是队头在队列中的地址,m_iHead,引入参数的作用只是为了后面课程需要,输出出队的元素,
DeQueue中使用了&是引用,插入到时候知道明确的插入值,直接使用就行,删除的时候并不知道要删除的具体数值,就用一个引用来代表该值。
传入的不是实际值,而是一个地址
在 DeQueue() 出队 函数部分有问题,判断条件应该是写错了,应该是 if (Queueempty()) , 而不是if (Queuefull())
就是对队列容量取余呀,因为队列容量是个常数,老师后面改了
为了保证循环操作的时候所有数据都能循环一遍,m_ihead并不一定等于0
一样的,因为数组名本来就是一个地址(该数组的第一个元素地址)加一个星号就成了指针,所以说是一样的。