我试图在不通过递归使用额外空间的情况下反转堆栈。但是找不到我的错误。
这是我的代码。它再次打印相同的堆栈。
#include<iostream>
#include<stack>
using namespace std;
void insert( stack<int>& k , int j){
k.push(j);
}
void reverse(stack<int> &s){
if(s.empty()){
return;
}
int temp = s.top();
s.pop();
reverse(s);
insert(s,temp);
}
int main()
{
stack<int>s;
for( int i = 5;i>0;i--){
s.push(i);
}
reverse(s);
while(!s.empty()){
cout << s.top() << " ";
s.pop();
}
return 0;
}
答案 0 :(得分:0)
您的递归性不正确。您删除顶部,递归调用相同的函数(反向),然后将其推回顶部。这不会改变它的位置!这同样适用于递归的所有元素:它们不会改变它们的位置。对您的问题采用纯递归解决方案(不使用其他堆栈或任何数据结构,如数组或列表)是不可能的。
答案 1 :(得分:0)
您的 insert()
函数不正确,因为您只将 temp 推入堆栈,一旦堆栈为空,temp 的值将为 5,因此推入 5,然后推入 4,依此类推。因此堆栈以相同的顺序填充。这 insert()
应该可以工作。
void insert( stack<int>& k , int j){
if(k.empty()){
k.push(j);
return;
}
int temp = k.top();
k.pop();
insert(k, j);
k.push(temp);
}
insert()
只是将 j
插入到栈底。