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

C++栈间同序转移元素时StackTransfer调用报错及逻辑正确性问询

问题解答

一、报错解决方法

报错的核心原因是调用对象和方法所属类不匹配,同时存在传参、返回值调用错误,具体修正点如下:

  • 错误1:StackTransfer是你自定义的Stack类的成员方法,但main函数中声明的st3是标准库std::stack<int>类型的对象,标准库原生栈类没有你自己实现的StackTransfer方法,自然会触发成员不存在的报错。
  • 错误2:StackTransfer的形参是std::stack<int>&引用类型,你调用时传入&st1、&st2属于指针类型,参数类型不匹配;同时该方法返回值为void,不能用cout直接输出其返回值。
  • 错误3:你自定义Stack类的push方法存在数组越界bug:top初始值为-1,你使用后置top++会先将值写入arr[-1]再对top自增,直接越界,需要改为前置++top。

具体修改方案

你可以选择将StackTransfer改为独立全局函数(更合理,因为该方法操作的是标准库std::stack,和你自定义的栈类无关),或者实例化你自己写的Stack类对象来调用该方法,同时修正传参和调用逻辑即可。

二、StackTransfer逻辑正确性验证

你写的递归转移逻辑是完全正确的,可以实现两个栈元素转移后保持原有顺序:
递归逻辑会依次取出s1的栈顶元素暂存在递归调用栈中,直到s1为空,再按弹出的逆序将元素压入s2,最终s2的栈底到栈顶顺序和原s1的栈底到栈顶顺序完全一致,且转移后原s1变为空栈。

三、修正后的完整代码

#include <iostream>
#include <stack>
using namespace std;

// 将StackTransfer改为全局函数,不需要放在自定义Stack类中
void StackTransfer(stack <int> &s1, stack <int> &s2)
{
    if (s1.empty())
        return;
    int x = s1.top();
    s1.pop();
    StackTransfer(s1, s2);
    s2.push(x);
}

int main()
{
    stack <int> st1, st2;
    st1.push(10);
    st1.push(20);
    st2.push(30);
    st2.push(40);
    
    // 转移st1所有元素到st2末尾,保持原有顺序
    StackTransfer(st1, st2);
    
    // 输出验证st2的元素:30 40 10 20(栈顶到栈底)
    cout << "st2的元素(从栈顶到栈底):" << endl;
    while(!st2.empty()){
        cout << st2.top() << " ";
        st2.pop();
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Imtiaz Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:39:04