筆試題:遞歸逆序棧
如將棧{5,4,3,2,1}置爲{1,2,3,4,5}
分析:
(1)把{1, 2, 3, 4, 5}看成由兩部分組成:棧頂元素1和剩下的部分{2, 3, 4, 5},
把{2, 3, 4, 5}顛倒過來,變成{5, 4, 3, 2},然後把原來棧頂元素1放到底部,變成
{5, 4, 3, 2, 1};
(2)把{2, 3, 4, 5}看成由兩部分組成:棧頂元素2和剩下的部分{3, 4, 5},
把{3, 4, 5}先顛倒過來,變成{5, 4, 3},然後再把之前的棧頂元素2放到最底部,變成了{5, 4, 3, 2}。
……
這就是遞歸。
遞歸結束的條件是棧空.
總結:取出棧頂元素,棧逆序,將棧頂元素壓入棧底
stack<int> ReverseStack(stack<int> stack)
{
if(stack.size()=1) return stack;
int top=stack.top();
stack.pop(); //取出棧頂元素
stack=ReverseStack(stack);//逆置棧
stack=PushStack(stack,top);//將棧頂元素壓入棧底;
return stack;
}
stack<int> PushStack(Stack<int> stack,int top)
{
if(stack.empty())
{
stack.push(top);//棧爲空,將棧頂元素壓入棧底
}
else
{
int tmp=stack.top();//不爲空,將其他元素彈出後再壓入
stack.pop();
stack=PushStack(stack,top)
stack.push(tmp);
}
return stack;
}