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
相关产品推荐
相关产品推荐

