You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:40:11