办法一(只采用一个stack), 通过递归实现:
// http://w...content-available-to-author-only...s.org/reverse-a-stack-using-recursion/
#include<iostream>
#include<stack>
using namespace std;
void printStack(stack<int> st)
{
while(!st.empty()){
cout<<st.top()<<" ";
st.pop();
}
cout<<endl;
}
//递归插入
void insertAtBottom(stack<int> &st, int data)
{
if( (st.empty()) ){
st.push(data);
}
else {
int temp = st.top();
st.pop();
insertAtBottom(st, data);
st.push(temp);
}
}
void reverseStack(stack<int> &st)
{
if( !(st.empty()) )
{
int temp = st.top();
st.pop();
reverseStack(st);
insertAtBottom(st, temp);
}
}
int main()
{
stack<int> st ;
st.push(4);
st.push(3);
st.push(2);
st.push(1);
printStack(st);
reverseStack(st);
printStack(st);
return 0;
}
上述算法中, 递归玩之后有进入下一个递归, 将elements 放在stack中。具体如下, 以4, 3, 2, 1顺序入栈:
reverseStack(1234) :
temp = 1, reverseStack(234), 进入下一下function stack: temp = 2, reverseStack(34), 进入下一个stack frame: temp = 3, reverseStack(4), 接下来, temp = 4, reverse(empty), 接下来, 逐次放回上次递归调用。 insertAtBottom(st, 4), 由于st此时为空的, 直接入栈st = 4, 接下来, 返回上一层递归调用, insertAtBottom(st, 3), 由于此时st不为空, 所以4出栈, 变为空, 3入栈, 返回上一层, 4入栈, 这样st就变成了: st = 43, 一次类推, 最终, st = 4321, 这样就利用stack frame, 只需要一个stack就实现了反转了。
方法二: 现在当有两个stack的时候, A, B, 我们只需要采用递归的办法, 把A的内容复制到B中, 然后在将B的内容pop到A中, 即可实现反转了。
程序如下:
#include<iostream>
#include<stack>
using namespace std;
void printStack(stack<int> st)
{
while(!st.empty()){
cout<<st.top()<<" ";
st.pop();
}
cout<<endl;
}
void reverseStack(stack<int> &st, stack<int> &st2)
{
if( !(st.empty()) )
{
int temp = st.top();
st.pop();
reverseStack(st, st2);
st2.push(temp);
}
}
int main()
{
stack<int> st, st2;
st.push(4);
st.push(3);
st.push(2);
st.push(1);
printStack(st);
reverseStack(st, st2);
printStack(st);
while(!st2.empty()) {
st.push(st2.top());
st2.pop();
}
printStack(st);
return 0;
}
运行如下: