C++单链表实现Stack的差集计算异常问题求助
问题分析与修复
问题根源
差集功能失效的核心原因是**unionStacks函数执行时清空了s2栈**。在原unionStacks实现中,直接对s2执行了pop操作且未恢复:
while (!s2.isEmpty()) { string element = s2.pop(); if (!result.find(element)) { result.push(element); } }
当main函数先调用unionStacks再调用difference时,s2已经被完全清空,此时difference里的s2.find(element)永远返回false,导致s1的所有元素都被判定为不在s2中,最终输出错误结果。
修复方案
修改unionStacks函数,增加临时栈保存s2的元素,处理完成后恢复s2,和你处理s1的逻辑保持一致。
修正后的代码
修正后的unionStacks函数
Stack unionStacks(Stack& s1, Stack& s2) { Stack result; Stack temp1; // 临时栈保存s1元素,用于恢复原栈 while (!s1.isEmpty()) { string element = s1.pop(); temp1.push(element); result.push(element); } // 恢复s1 while (!temp1.isEmpty()) { s1.push(temp1.pop()); } Stack temp2; // 临时栈保存s2元素,用于恢复原栈 while (!s2.isEmpty()) { string element = s2.pop(); temp2.push(element); if (!result.find(element)) { result.push(element); } } // 恢复s2 while (!temp2.isEmpty()) { s2.push(temp2.pop()); } return result; }
预期输出
运行修正后的代码,输出将符合需求:
Stack S1: cherry banana apple Stack S2: date cherry banana Intersection (S3): cherry banana Union (S4): date cherry banana apple Difference (S5): apple
额外优化建议
- 为
Stack类添加拷贝构造函数和赋值运算符重载,避免浅拷贝导致的指针重复释放问题(当前测试场景未触发,但长期使用存在风险)。 - 将
find函数设为私有成员,仅在类内部或友元函数中调用,提升类的封装性。
内容的提问来源于stack exchange,提问作者Berke Kale
相关产品推荐
相关产品推荐

