首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

困扰一天了,关于队列出队,该怎么处理

2013-12-28 
困扰一天了,关于队列出队本帖最后由 u012941710 于 2013-12-16 20:43:00 编辑bool Queue::dequeue(Item&it

困扰一天了,关于队列出队
本帖最后由 u012941710 于 2013-12-16 20:43:00 编辑

bool Queue::dequeue(Item&item)
{
if (front == nullptr)
return false;
item = front->item;//引用的参数本来就是首项目,front->item
items--;           //为什么还要item=front->item呢
Node *temp = front;
front = front->next;
delete temp;//删除temp的时候,不是已经把以前的front->item删除了吗
if (items == 0)
rear = nullptr;
return true;
}

以上是一个队列首项目出队的代码。看不懂第3行,求大神指点
[解决办法]
你现在换个身份,以这个函数的使用者的身份调用一个这个函数。 你期待什么结果? 

当你大声冲你的无脑同事喊“下一位”时, 你同事只喊了一声“有”, 然后半天没了动静, 你出去一看, 人呢? 同事说:我让他走了。 你暴怒:我让你把他带进去,你怎么直接把人轰走了!

对于dequeue操作,不能光返回一个有、无就完了, 有的话, 队首值也是要返回的。

引用:
Quote: 引用:

楼主对引用的理解有偏差。 引用本身是不能赋值的,引用只能初始化(这句措辞有精确,注意领会精神)。 在引用声明并初始化之后,对引用的一切操作都是针对被引用对象的。
所以 item = front-item; 是对item引用的对象进行复制(会调用Item类的赋值运算符)。也就是说这句执行完,item与front->item是“相等”的两个不同的对象。因此delete front-item并不会影响item。

另外这个函数设计极其蹩脚, 即不是C++的风格,也不是老式的C风格, 还好Queue与dequeue这种概念大家都非常熟悉, 猜也可以猜个大概。 否则,这种代码绝对让人崩溃,你不看它的实现你就绝对不敢保证自己知道它是干什么的。
朋友,还有一点没懂的就是,这个item存在的意义是什么,为什么莫名其妙来个item呢

[解决办法]
引用:
Quote: 引用:

你的理解没有什么大的偏差
不过要注意一个问题
队列中的数据出队之后,我很可能还要对这个数据进行后续操作
所以需要保存出队的值
举个例子,假设队列中有数据1,2,3
我的题目是:将队列中的第一个元素取出,并且加1

int val;
q.dequeue(val);//在这里我们将队头元素出队,放到val中,然后对val加1
val++;//如果不保存这个队头元素的话,那他岂不是丢失了
我基本理解你说的意思了,又看了几次代码,确实如果删除了front->item,
那么后续对于front->item的操作就无法进行了,那么需要一个东西来保存他,以便继续后面的操作。
还有点疑问,这个Item &item,和front->item,本来就是同一个东西的两种写法啊,删除其中一个,
那么两个都应该不在了呀,难道说引用也有实体?

不是,他们两个只是值相等,而不是同一个对象
以上面的例子为例,item和val是同一个对象,而front->item只是值与其相等,删除一个并不影响另一个,lz要好好补一补引用的知识了

热点排行