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

【题目】

  • 一个栈依次压入1,2,3,4,5;那么从栈顶到栈底分别为5,4,3,2,1.。将栈转置

【要求】

  • 只能用递归函数来实现。

【分析】
该算法需要两个递归函数。分别是getAndRemoveLastElement()Reverse()

函数名 描述
getAndRemoveLastElement 将栈Stack的栈底元素返回并移除。作为中间步骤被Reverse使用
Reverse 算法的入口。主要功能为将栈顶元素优先压入栈中(放在栈底)
  • 关于getAndRemoveLastElement函数

    • 伪代码如下:
    function getAndRemoveLastElement
    result=stack.pop();
    if stack为空
      返回结果result
    else
      last=getAndRemoveLastElement();
      stack.push(result)  //重新将取出的非栈底元素放回
      return last
    • 上面的伪代码可以理解为:不停地出栈,我们要找的是栈底元素,栈底元素的标志就是:当栈底元素出栈时,栈即变为空栈
    • 利用该标志的代码为:
    if stack为空
      返回结果result
    • 当到了栈底,则开始将非栈底的元素重新按顺序压入栈中。而原来的栈底元素一直随着 return resultreturn last 返回到last
    last=getAndRemoveLastElement();
    stack.push(result)  //重新将取出的非栈底元素放回
    return last
    • 因此我们无论是仅为1个元素的栈(这种情况返回的是result)还是1个元素以上的栈(这是返回值是last)都返回的是栈底元素。而非栈底元素将会重新压入栈中。
  • 关于Reverse函数

    • 整个算法的入口,它利用前一个getAndRemoveLastElement()并自身递归实现了逆序。
    • 利用getAndRemoveLastElement()我们可以获取到栈底元素,而Reverse递归主要是将最后一次获取的栈底元素(即栈顶元素)先入栈。
    • 伪代码如下
    function Reverse
    if stack为空
      return;    //禁止实现后面的操作
    int i=getAndRemoveLastElement()
    Reverse()
    i入栈
    • Reverse函数会将push操作卡到最后一次获取到的栈底元素(即栈顶元素),当整个栈的元素均获取完后,开始将元素一个个push入栈中。即可达到逆序效果。

【实现】

  • 实现语言:C++
  • 源代码如下:
/*仅用递归函数和栈操作逆序一个栈*/
#include<iostream>
#include<stack>
using namespace std;

//第一个递归函数
int getAndRemoveLastElement(stack<int> *_stack)
{
    int result=_stack->top();  //首先出栈
    _stack->pop();
    if(_stack->empty())        //当出栈后为空时,证明result就是栈底元素
        return result;        //返回栈底元素
    else
    {
        //递归调用该函数,last一直被赋值为栈底元素
        int last=getAndRemoveLastElement(_stack);
        _stack->push(result);  //将非栈底元素重新压回栈中
        return last;          //一直返回栈底元素
    }
} 

//第二个递归函数
void Reverse(stack<int> *_stack)
{
    if(_stack->empty())    //如果已经操作到最后一个取出的栈底元素(即为栈顶元素),就无任何操作的返回
        return;

    int i=getAndRemoveLastElement(_stack);
    //未到栈顶元素,继续递归
    Reverse(_stack);
    _stack->push(i);
} 

int main()
{
    stack<int> test;
    stack<int> *p=&test;

    int temp;
    for(temp=1;temp<6;temp++)
        test.push(temp);

    Reverse(p);

    cout<<"逆置之后"<<endl;
    while(!test.empty())
    {
       cout<<test.top()<<" ";
       test.pop();
    }
}
  • 控制台截图

原文地址:https://www.cnblogs.com/ZhuSenlin/p/12384477.html

时间: 2024-10-11 22:09:49

[Daily]仅用递归函数和栈操作逆序一个栈的相关文章

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

题目:一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1.将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其它数据结构. 1 //仅用递归函数和栈操作逆序一个栈 2 #include <stdio.h> 3 #include "stack.h" //该头文件包含栈操作的原型声明等相关信息 4 5 SqStack stack; 6 7 //获取栈底元素并删除 8 int getAndRemov

编程3:仅用递归函数和栈操作逆序一个栈

<?php header("content-type:text/html;charset=utf-8"); /* * 仅用递归函数和栈操作逆序一个栈 P8 */ function getAndRemoveLastElement(SplStack $stack){ if($stack->isEmpty()){ return false; } $value = $stack->pop(); if($stack->isEmpty()){ return $value;

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

题目: 一个栈依次压入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, 逆序空栈.依次返回插入获取的栈底元素,也就是依次插入

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

[题目]? 一个栈依次压入1.2.3.4.5,那么从栈顶到栈底分别为5.4.3.2.1.将这个栈转置后,从栈顶到栈底为1.2.3.4.5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他的数据结构. [解答] ?首先分为两步.第一步,得到栈底元素并移除这个栈底元素:第二步,将得到的栈底元素逆序入栈. [代码] 1 package cn.hl.p3; 2 3 import java.util.Stack; 4 5 /** 6 * title:一个栈依次压入1.2.3.4.5, 7 *

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

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

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

要求: 一个栈依次压入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

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

问题描述: 一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1.将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,而不能用另外的数据结构. 实现代码: #include <stack> #include <stdio.h> using namespace std; int GetAndRemoveBottom(stack<int> &ss) { int top, bottom; top =

【算法题】03-使用递归和栈逆序一个栈

题目 仅用递归操作和栈逆序 一个栈. 一个栈依次压入1.2.3.4.5 那么从栈顶到栈底分别是5,4,3,2,1.将这个栈转置后,从栈顶到栈底为1.2.3.4.5,也就是实现栈中元素的逆序,但是只能用递归来实现 ,不能用其他数据结构. 思路 需要两个递归函数 递归函数一:将栈stack的栈底元素返回并移除 /** * @Desc 获取栈底元素返回并移除 * @param stack * @return */ public static int getAndRemoveLastElement(St

栈和队列----用递归函数和栈的操作实现逆序一个栈

用递归函数和栈的操作实现逆序一个栈 一个栈依次压入1.2.3.4.5,那么从栈顶到栈底分别为5.4.3.2.1,将这个栈转置后,从栈顶到栈底为1.2.3.4.5,也就是实现栈中元素的逆序,但是只能使用递归函数来实现,不能实现其他数据结构. package com.test; import java.util.Stack; /** * Created by Demrystv. */ public class ReverseStack { //将栈stack的栈底元素返回并且删除 private s