美文网首页
栈的反转

栈的反转

作者: 熊白白 | 来源:发表于2017-07-08 20:50 被阅读112次

实现一个栈的逆序,但是只能用递归函数和这个栈本身的pop操作来实现,而不能自己申请另外的数据结构。
听上去完全是玩弄伎俩的东西。自己思考的话确实不容易想到,所以它的意义更多在于理解递归。

CODE1

    int delLast(stack<int>&s){
        int t=s.top();
        s.pop();
        if(s.empty()){
            return t;
        }
        int u=delLast(s);
        s.push(t);
        return u;
    }

上述函数的功能在于将栈底元素删除,并返回。整个递归过程是这样的:

  • 弹出栈顶元素记为t
  • 若空,返回t(因为t就是栈底元素),函数退出
  • 若不为空:处理栈,返回为u
  • 压入t,返回u

说了半天没头没脑的,等于没说。我们举个例子:
国王告诉我:有一座地下塔,去塔底解救公主。
我走到塔前面,打开第一层的大门,发现里面好黑好害怕,于是找了个小弟告诉他说:
从这里下去,到塔底解救公主。
然后我等小弟回来,从他手里接过公主,把第一层的大门关上,带公主回去。
任务完成。
但是那请问这个小弟会怎么做呢?

  • 打开所在层的大门
  • 交给下一个小弟
  • 等下一个小弟完成任务,从他手里接过公主
  • 关闭大门
  • 抱公主给上一层

唯一不同的是,最后一层的小弟,发现那里没有大门可以开,只有公主。那就直接把公主抱上去就可以了。
这就叫做“层层外包”。
也就是说:

  • 弹出栈顶元素记为t(打开某一层的大门)
  • 若空,返回t(因为t就是栈底元素),函数退出(抱公主上去)
  • 若不为空:处理栈,返回为u(外包给下一层的小弟,等待他抱公主上来)
  • 压入t,返回u(关闭大门,抱公主上去)

弹出了一个元素,然后再处理这个栈,感觉上就是处理了栈的下一层。
记得处理完以后把弹出的元素压回去。

CODE2

void rever(stack<int>&s){
        if(s.empty())
            return;
        int t=delLast(s);
        rever(s);
        s.push(t);
        return;
    }

上述函数的作用就是反转整个栈。
如果我有一摞书,希望把它们反转,我只能做的事情是:

  • 从一摞书的表面拿起来一本
  • 把一本书放在一摞书的表面

因为我们有了之前“釜底抽薪”的函数,所以还可以做一件事:

  • 从一摞书中抽取最底层的一本书(此时其他书就会下沉一格)

我需要做的是:

  1. 抽出最下面一本
  2. 剩下的书交给我的小弟来处理
  3. 把抽出的书放回表面

每个小弟所做的工作跟上面是一样的,处理最后的一个小弟:

  • 如果发现当前待处理的书没有了,就什么也不做,返回。

栈是一种特别的数据结构,特别在它只能访问栈顶元素。所以它和递归的结合,不仅有趣,而且很讨人烦。

相关文章

  • 栈的反转

    实现一个栈的逆序,但是只能用递归函数和这个栈本身的pop操作来实现,而不能自己申请另外的数据结构。听上去完全是玩弄...

  • 链表反转

    链表反转的思路:1.利用栈后进先出的特性,将链表的每个节点都Push进栈,然后再Pop出栈,保存进链表,实现反转。...

  • 2020-02-09 刷题 3(字符串)

    344 反转字符串 用双指针原地反转,很简单 7 整数反转 标签:栈 字符串 溢出这个题目是一个典型的用栈的题,如...

  • 采用栈结构,递归实现链表的反转

    采用栈结构,递归实现链表的反转 CSDN

  • Java示例教程

    Java 实现栈stackJava 实现栈stack2Java 向量Vector 反转Java 向量Vector ...

  • 2022-02-24 025,024 链表反转,链表中的两数相

    链表反转:思路采用栈,而栈可以用slice的思路实现Go版本 链表两数相加:纯粹的反转相加,注意考虑类似于l1=[...

  • 栈问题之栈的反转

    1. 可以使用O(N)空间 可以使用队列这个很简单了,就是将栈每个元素依次pop放入队列中,然后从队列中依次pus...

  • 2022-01-09 链表

    链表定义: 反转链表:用到了之前写的ArrayDeque来当作栈使用,因为ArrayDeque的方法可以作栈和队列...

  • 巧用函数栈实现栈的反转

    一、函数栈 函数的调用过程其实就是一个压栈的过程,在函数栈中,每个函数所占空间成为一个 栈帧。栈帧中保存着函数的形...

  • 栈--递归逆序栈

    反转栈的数据,我们很容易想到可以使用两个栈来实现,一个栈将数据全部压入后,再依次出栈并且依次入栈到另一个栈中,得到...

网友评论

      本文标题:栈的反转

      本文链接:https://www.haomeiwen.com/subject/uaejhxtx.html