美文网首页
数据结构算法之递归和栈结构

数据结构算法之递归和栈结构

作者: Peakmain | 来源:发表于2019-03-26 14:20 被阅读0次

递归

程序调用自身的编程技巧称为递归
简单案例:n的阶乘

//n的阶乘
int sum(int n) {
    if (n == 1) {
        return n;
    }

    return n * sum(n - 1);
}

汉诺塔

汉诺塔问题描述:3个柱为a、b、c,圆盘最初在a柱,借助b柱移到c柱
规则;每次只能挪动一个 大的必须在下面
动画演示:(图片是网上的)

汉诺塔三个圆盘的过程.gif 汉诺塔四个圆盘的过程.gif

对3个圆盘进行详细分析(假设最上面的是第1个盘子,中间是第2个盘子,最下面最大的第3个盘子)

把1个盘子从A挪到C
把2个盘子从A挪到B
把1个盘子从C挪到B
把2个盘子从A挪到B
把3个盘子从A挪到C
把1个盘子从B挪到A
把2个盘子从B挪到C
把1个盘子从A挪到C
把2个盘子从B挪到C
把3个盘子从A挪到C

简单分析就是,当就1个盘子的时候直接将盘子从A移动到C,若不是,则将n-1个盘子A借助C移动B,然后B中盘子借助A移动到C

void hannuota(int n,char start,char help,char end){
     if(n==1){
         LOGE("把%d个盘子从%c挪到%c",n,start,end);
     }else{
         //把A挪动B
         hannuota(n-1,start,end,help);
         LOGE("把%d个盘子从%c挪到%c",n,start,end);
         hannuota(n-1,help,start,end);
         LOGE("把%d个盘子从%c挪到%c",n,start,end);
     }

}

数组实现栈

代码有详细介绍,不阐述

#ifndef NDK_ARRAYSTACK_H
#define  NDK_ARRAYSTACK_H

#include "malloc.h"
#include <assert.h>
template<class E>
class ArrayStack {
    //栈是先进后出
private:
    //栈顶元素的角标
    int top = -1;
    E *array = NULL;
    //栈的初始长度
    int size = 10;
public:
    ArrayStack();

    ~ArrayStack();

public:
    //栈是否是空的
    bool isEmpty();

    /**
     * 弹出栈顶的元素
     */
    E pop();

    /**
     * 获取栈顶的元素但是不弹出
     */
    E peek();

    /**
     * 将元素入栈
     * @param e
     */
    void push(E e);

    void growArray();
};

template<class E>
ArrayStack<E>::ArrayStack() {
    array = (E*)malloc(sizeof(E) * size);
}
/**
 * 析构函数 释放内存
 */
template<class E>
ArrayStack<E>::~ArrayStack() {
    delete[]array;
}
/**
 * 判断是否为空
 */
template<class E>
bool ArrayStack<E>::isEmpty() {
    return top == -1;
}
/**
 * 弹出栈顶的元素
 */
template<class E>
E ArrayStack<E>::pop() {
    assert(top>=0);
    return array[top--];
};
/**
 * 获取栈顶的元素但是不弹出
 */
template<class E>
E ArrayStack<E>::peek() {
    return array[top];
}
/**
 * 添加数据
 */
template<class E>
void ArrayStack<E>::push(E e) {
    //判断是否有足够的空间
    if (top + 1 == size) {
        //扩容
        growArray();
    }
    array[++top] = e;
}
/**
 * 扩容
 */
template<class E>
void ArrayStack<E>::growArray() {
    size += size >> 1;
    //重新开辟内存空间
    array = (E*)realloc(array, sizeof(E) * size);
}

#endif

相关文章

  • C++数据结构与算法完整pdf 下载

    数据结构和算法之间的联系,使用面向对象的方法介绍数据结构,其内容包括算法的复杂度分析、链表、栈、队列、递归、二叉树...

  • 数据结构算法之递归和栈结构

    递归 程序调用自身的编程技巧称为递归简单案例:n的阶乘 汉诺塔 汉诺塔问题描述:3个柱为a、b、c,圆盘最初在a柱...

  • Android面试题总结(题目+复习链接)

    数据结构 1.栈实现原理 java数据结构与算法之栈(Stack)设计与实现 - CSDN博客 2.链表实现原理 ...

  • 2019-07-11—栈

    栈:Java数据结构和算法(四)——栈 string和char一般这么转化: 21、定义栈的数据结构,请在该类型中...

  • 数据结构与算法(8)-栈与递归的关系

    数据结构与算法(7)-栈 递归: 在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。也就是说,递归算法是...

  • 浅谈算法和数据结构

    注:采转归档,自己学习查询使用 浅谈算法和数据结构: 一 栈和队列浅谈算法和数据结构: 二 基本排序算法浅谈算法和...

  • JavaScript_数组

    一、 数据结构 数据结构分为: 逻辑结构、存储结构和算法。 (一)存储结构 a. 线性 栈 队列 堆 数组 …… ...

  • 数据结构与算法 (栈实现篇)

    数据结构与算法 (栈实现篇) 在数据结构与算法中,栈(stack)又名堆栈,栈是一种受限的线性储存结构,只允许在一...

  • Java数据结构算法(五)排序

    算法这点粗略整理一下,后面完善 Java数据结构算法(一)链表 Java数据结构算法(二)栈和队列 Java数据结...

  • 100天iOS数据结构与算法实战 Day02 - 栈

    100天iOS数据结构与算法实战 Day02 - 栈 100天iOS数据结构与算法实战 Day02 - 栈

网友评论

      本文标题:数据结构算法之递归和栈结构

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