笔、面试题积累(1) 颠倒栈

来源:互联网 发布:wp config.php 编辑:程序博客网 时间:2024/05/24 04:31

来自剑指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);              //递归调用ReverseStackAddToStackBottom(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);            //将栈顶元素压入栈底    }}


采用递归套递归的方式。

0 0