c++ - 在 C++ 中使用递归的另一个空堆栈的帮助下反转堆栈?
问题描述
我对这个问题的处理方法是,由于递归使用堆栈工作,所以如果我的输入是一些 n 数字,递归将为我提供从 1 到 n 的堆栈反转并添加第 0 个元素,我将首先复制堆栈(比如 S1 ) 放入一个空堆栈(例如 S2)并将第 0 个元素推入 S1,然后将元素从堆栈 S2 复制回 S1。这是我的代码,我无法找出实现我的方法的问题。
void reverseStack(stack<int> &input, stack<int> &extra) {
if(input.size()==0)
{
return;
}
int x=input.top();
input.pop();
reverseStack(input,extra);
for(int i=0;i<input.size();i++)
{
extra.push(input.top());
input.pop();
}
input.push(x);
for(int i=0;i<extra.size();i++)
{
input.push(extra.top());
extra.pop();
}
}
解决方案
由于堆栈是先进后出 (FILO) 数据结构,因此可以通过反复移除顶部元素并将其推入另一个堆栈来实现堆栈的反转。最后,只需将原始堆栈替换为反向堆栈即可。move
语义的使用避免了任何深拷贝。
template<typename T>
void reverse(std::stack<T> &the_stack)
{
std::stack<T> reverse_stack;
while(!the_stack.empty()) {
reverse_stack.push(std::move(the_stack.top()));
the_stack.pop();
}
the_stack = std::move(reverse_stack);
}
这不使用递归,但是任何迭代程序都可以重新制定为递归程序,例如
template<typename T>
void reverse_recursive(std::stack<T> &the_stack,
std::stack<T> &reverse_stack)
{
if(!the_stack.empty()) {
reverse_stack.push(std::move(the_stack.top()));
the_stack.pop();
reverse_recursive(the_stack,reverse_stack);
} else
the_stack = std::move(reverse_stack);
}
template<typename T>
void reverse(std::stack<T> &the_stack)
{
std::stack<T> auxiliary_stack;
reverse_recursive(the_stack,auxiliary_stack);
}
这比简单的迭代解决方案更复杂。
推荐阅读
- kotlin - 智能投不投String?!value.isNullOrBlank() 之后的字符串
- android - 为什么我在 StringReader read() 中得到 IndexOutOfBoundsException?
- http - 与本地主机上的内部反向代理的内部 ServiceFabric 通信
- virtocommerce - 来自 Github 的 virto 商务部署
- html - CSS:强制无线电输入检查
- javascript - 在 Angular JS 中过滤我的 JavaScript 中的未定义
- android - 如何在 Delphi Android 应用程序中调用本机相机?
- c# - 注册表设置值代理仅工作 1 次
- swift - Swift:如何访问字典数组中的字典数组?
- javascript - window.location 未替换但已连接