来自剑指Offer
题目:利用递归颠倒一个栈。输入栈{1,2,3,4,5},1为栈顶, 颠倒之后{5,4,3,2,1},5为栈顶 。
自己设计的方案:
利用一个辅助栈,将输入栈中的元素压入辅助栈中,再依次弹出,则完成了颠倒。
剑指Offer上的解决方案为:利用递归的方法,先将栈顶元素弹出,再将剩下的元素翻转,最后将弹出的栈顶元素放入栈底。
此种方案要想将取出栈顶元素后的栈元素进行翻转,需要分配一组存储空间,但递归即为一种栈操作,所以可以利用递归的栈来保存要被翻转的元素。
template<typename T> void ReverseStack(stack<T>& stack) { if(!stack.empty()) { T top = stack.top(); //提取出栈顶元素值 stack.pop(); //弹出栈顶元素 ReverseStack(stack); //递归调用ReverseStack AddToStackBottom(stack,top); //递归返回时调用将每一层的栈顶值放到栈底 } } template<typename T> void AddToStackBottom(std::stack<T>& stack, T t) { if(stack.empty()) //如果栈为空则将栈顶元素压入栈中 { stack.push(t); } else { T top = stack.top(); //提取出栈顶元素 stack.pop(); //弹出栈顶元素 AddToStackBottom(stack, t); //递归调用将栈顶元素放到栈底 stack.push(top); //将栈顶元素压入栈底 } }
采用递归套递归的方式。