美文网首页数据结构与算法
数据结构与算法(五,栈和栈的应用,递归思想)

数据结构与算法(五,栈和栈的应用,递归思想)

作者: 腊鸡程序员 | 来源:发表于2019-01-25 15:35 被阅读20次

栈是只在尾部做添加和删除的线性表

栈的顺序结构方式
  • 栈的顺序存储结构是使用数组实现的,Stack继承了Vector
  • 添加元素时
public synchronized void addElement(E obj) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = obj;
    }

首先判断是否需要扩容
然后将elementCount位置即栈顶指针指向的位置,赋值为obj
然后将elementCount++,即栈顶指针上移一格,指向一格空地址

  • 删除一个元素
 elementCount--;
 elementData[elementCount] = null; /* to let gc do its work */

首先将栈顶指针下移一格
然后将指针所指向的位置置空

  • Vector和ArrayList的区别
    Vector是jdk1.0版的顺序表,当时考虑到要在很多场景使用,添加了大量的同步锁,是线程安全的
    但是后来发现,这些线程同步锁很多都用不到
    ArrayList是jdk1.2版本的,是去掉了同步锁的Vector
栈的链式结构方式

栈在计算机中的应用

  1. 链表的倒序
    将链表存放到链式结构的栈中,进行入栈操作
s = first;//将链表头结点入栈
stack.top = s;
first = first.next();
  1. 逆波兰表达式-->中缀表达式-->后缀表达式-->计算方式
    9+(3-1)X3+10/2
    标准四则运算表达式是中缀表达式
  • 9 3 1 | + ( - )
  • 9 3 1 - 3 | + X
  • 9 3 1 - 3 X +10 2 | + /
    *9 3 1 - 3 X + 10 2 / +
  • 计算机中首先将中缀表达式转换成后缀表达式
    转换方法:数字输出,符号入栈,括号匹配出栈,优先级高入栈,优先级低将栈内符号出栈,
  • 计算后缀表达式
    数字入栈,符号就取两个数字出栈计算后再入栈
    9 3 1 | 3-1=2
    9 2 3 | 2X3 = 6
    9 6 | 9+6 = 15
    15 10 2 | 10/2 = 5
    15 5 | 15+5 = 20

递归的思想

  • 程序调用自身
  • 递归的边界条件,在满足边界条件之前,递归前进,满足边界条件之后,递归返回
  • 将大型复杂问题分解成与原问题相似的规模小的问题
阶乘
  • 前进段:n! = n*(n-1)!
  • 边界条件1!=1
  • 返回段:无
  public Long jc (int n){
        if (n<=1){
            return 1l;
        }else {
            return n*jc(n-1);
        }
    }
斐波那契数列

1 1 2 3 5 8
除前两项外,其他项等于前两项之和

  • 前进段: f(n) = f(n-2)+f(n-1)
  • 边界值:n<=1 n = 1
  • 返回段:无
   public int fibonaaci(int n){
        if (n<=1){
            return 1;
        }else {
            return fibonaaci(n-2)+fibonaaci(n-1);
        }
    }
汉诺塔

将问题简化成两块砖(n1,n2),3根柱子(start,middle,end)
现将n2移动到middle,再将n1移动到end,再将n2移动到end

  • 前进段: f(n-1,1,3,2)//n-1个通过第3根柱子移到第2根柱子
    f(1,1,2,3)//第n个通过第2根柱子移到第3根柱子
    f(n-1,2,1,3)//n-1个通过第1根柱子移到第3根柱子
  • 边界值:f(1,1,2,3) = 1--->3
  • 返回段:无
public void hannoi(int n,int start,int middle,int end){
        if (n<=1){
            System.out.println(start+"--->"+end);
        }else {
            hannoi(n-1,start,end,middle);
            System.out.println(start+"--->"+end);
            hannoi(n-1,middle,start,end);
        }
    }

相关文章

  • 数据结构与算法(五,栈和栈的应用,递归思想)

    栈 栈是只在尾部做添加和删除的线性表 栈的顺序结构方式 栈的顺序存储结构是使用数组实现的,Stack继承了Vect...

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

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

  • Java实现单向链表基本功能

    一、前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。数组和链表都是线性存储结...

  • Java实现单向链表基本功能

    一、前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了。数组和链表都是线性存储结...

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

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

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

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

  • 数据结构与算法 第二节:栈 栈: 一种先进后出的数据结构。可以想象成手枪的弹夹。 栈的特点: 栈的行为: 栈的代...

  • 004-数据结构与算法-栈和递归的关系

    栈的应用-递归 上一节我们讲到了栈这种数据结构,那么在实际编程中有哪些应用呢?这篇文章我们来研究一下栈的一种应用-...

  • 栈与队列

    数据结构整理篇。 概念: 栈(stack):是限定仅在表尾进行插入和删除操作的线性表。 栈的应用--递归:把一个直...

  • 2019 算法面试相关(leetcode)--栈和队列

    栈和队列都是比较常用的数据结构。栈的应用非常的广泛,比如说,递归函数的实现就是借助于栈保存相关的数据。操作系统中每...

网友评论

    本文标题:数据结构与算法(五,栈和栈的应用,递归思想)

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