O(1) 空间复杂度逆序栈和排序栈

两种操作都是递归实现,汉诺塔思想。

#include<iostream>
#include<stack>
using namespace std;

void reverse(stack<int> &s)//逆序栈
{
    if(s.size()==0)
        return ;
    int a=s.top();
    s.pop();
    if(s.size()==0)
    {
        s.push(a);
        return ;
    }
    reverse(s);
    int b=s.top();
    s.pop();
    reverse(s);
    s.push(a);
    reverse(s);
    s.push(b);
}
void Sort(stack<int>&s)//栈顶放大元素
{
    if(s.size()==0)
        return ;
    int a=s.top();
    s.pop();
    if(s.size()==0)
    {
        s.push(a);
        return;
    }
    Sort(s);
    int b=s.top();
    s.pop();
    if(a<b)
    {
        s.push(a);
        Sort(s);
        s.push(b);
    }
    else
    {
        s.push(b);
        Sort(s);
        s.push(a);
    }
}
int main()
{
    stack<int>s;
    for(int i=0;i<10;++i)
        s.push(i);
    reverse(s);
    Sort(s);
    while(!s.empty())
    {
        cout<<s.top()<<endl;
        s.pop();
    }
    getchar();
    return 0;
}

运行结果如下:

时间: 2024-10-08 10:29:09

O(1) 空间复杂度逆序栈和排序栈的相关文章

O(1)时间复杂度逆序栈和排序栈

两种操作都是递归实现,汉诺塔思想. 1.逆序栈 void ReverseStack(Stack& stack) { if (stack.Count == 0) return; object top = stack.Pop(); ReverseStack(stack); if (stack.Count == 0) { stack.Push(top); return; } object top2 = stack.Pop(); ReverseStack(stack); //p1 stack.Push(

&quot;Coding Interview Guide&quot; -- 仅用递归函数和栈操作逆序一个栈

[题目] 一个栈依次压入1.2.3.4.5,那么从栈顶到栈底分别为5.4.3.2.1.将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能使用其它数据结构 [分析] 栈是一种操作受限的数据结构,只能从某一端进行插入和删除和访问元素.能进行插入删除和访问等操作的一端称为“栈顶”,相对的另一端,不能进行任何栈操作,称为栈底.栈中除了栈顶元素外,其它的栈元素都是不允许访问的.所以想要访问栈中其它元素,则只能将将栈中元素依次弹出直到该元素成为栈顶元素

栈和队列----将单链表的每K个节点之间逆序

将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1->2->3->4->5->6->7->8->null,k=3. 调整好后:3->2->1->6->5->4->7->8->null,其中7.8不调整,因为不够一组. [解析] 1. 首先从左到右遍历链表,如果栈的大小不等于k ,则不断的

【栈】仅用递归函数和栈操作逆序一个栈

题目: 一个栈依次压入1.2.3.4.5,那么从栈顶到栈底分别为5.4.3.2.1.将这个栈转置后,从栈顶到栈底为1.2.3.4.5,也就是实现栈中元素的逆序.但是只能用递归函数来实现,不能用其他数据结构 题解: 需要两个递归函数:1. 将栈底元素返回并删除:2. 逆序一个栈 过程即为获取栈底元素,逆序2.3.4.5,递归后获取栈底元素2,逆序3.4.5,再次递归获取栈底元素3,逆序4.5,再次递归获取栈底元素4,逆序5,最后获取栈底元素5, 逆序空栈.依次返回插入获取的栈底元素,也就是依次插入

只使用递归实现栈的逆序操作

2017-06-23 20:36:02 刚开始思考这个问题的时候陷入了一个误区,就是以为只能用一个递归完成. 然而事实上,可以使用两个递归来完成这个功能. 具体思考是这样的,首先递归其实是将问题规模缩小了,每次处理更小的问题.针对这题来说,更小的问题应该是去除底部那个数后的逆序再加上最后的数. 当然,你可能会问,什么不是去掉最上面的数,然后将它再放到最前面,理由很简单,栈是一种后进先出的数据结构,这种类型的数据结构适合的是在尾部添加数据,而非在首部添加数据,所以更清晰的或者说更适合栈的操作是先把

用递归函数和栈操作逆序栈

题目描述 一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1.将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构. 给定一个栈Stack以及栈的大小top,请返回逆序后的栈. 测试样例: [1,2,3,4,5],5 返回:[5,4,3,2,1] Solution 1:思路:第一步,将最上面的数出栈保存,然后将栈逆序(递归) 第二步,将第一步中出栈的数插入到栈的最底层(

利用栈逆序元素

要求:利用栈将数组的元素逆序输出 分析:        1.数组中的元素是线性排列 2.栈的特点是先进后出 解题思路:将数组中的元素依次压栈,再出栈.就能实现对数组元素的逆序 1.定义结构体 #define N 50 struct mystack { int top; //栈顶元素 int data[N]; }; struct mystack selfStack={-1,{0}}; //初始栈为空 2.声明函数 int isEmpty();//判断栈是否为空 返回值:1-->空 0-->非空

数组操作之遍历,排序,逆序

数组遍历: 索引遍历 枚举遍历: NSEnumerator* enumerator = [array objectEnumerator]; id e = nil; while (e = [enumerator nextObject]) { NSLog(@"e = %@", e); } 代码块遍历: // 示例1:枚举遍历 [array enumerateObjectsUsingBlock:^ (id obj, NSUInteger idx, BOOLBOOL *stop){ NSLog

仅用递归函数和栈操作逆序一个栈

要求: 一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1.将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,而不能用另外的数据结构. import java.util.Stack; public class Problem03_ReverseStackUsingRecursive { /* * 递归得到栈底元素 */ public static int getAndRemoveLastElement(Stack<Inte