数据结构学习(二):栈与栈的应用

149 阅读2分钟

栈的定义

一种先进后出的方式 栈

栈的实现

一:顺序方式 顺序方式

  • 应用:Stack.java

二:链式方式 链式方式 进栈操作: 进栈操作 出栈操作: 出栈操作

栈的应用

  • 数据顺着输入,倒着输出用到栈
  • 逆波兰表达式 标准四则运算表达式—中缀表达式 9+(3-1)X3+10/2 20 计算机采用—后缀表达式 9 3 1 - 3 * + 10 2 / + 20

下图中横向表示栈顶,竖向表示取到的操作符 逆波兰表达式规则

中缀表达式转化为后缀表达式的规则: 数字输出,运算符进栈,括号匹配出栈,比栈顶优先级低就出栈(表中1>2)

后缀表达式的计算法则: 1。数字入栈 2.符号就取2个进行计算(栈定元素放在符号右边),再入栈

递归基础

程序调用自身的编程技巧称为递归(recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法, 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的能力在于用有限的语句来定义对象的无限集合。 一般来说,递归需要有边界条件、递归前进段和递归返回段。 当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归思想

    /**
     * 测试递归的思想
     */
    public void fun(int n){  //3
        System.out.println(n);
        if(n<0){
            return;
        }else{
            fun(n-1);
            System.out.println(n);
        }
    }

测试递归的思想执行过程 运行结果

递归的例子

1:求n的阶层

  /**
     * 1*2*3*4*5....     n!
     * 5!  = 5*4!      4! =  4*3!
     */
    public int fact(int n){
        if(n<=1){
            return 1;
        }else{
            return n*fact(n-1);
        }
    }

2:斐波那契数列

/**
     * fibonacciSequence数列   8=7+6   7=6+5  6=5+4
     * 1   1  2  3  5  8   13  21  34  55  89  144......
     * 返回第n项
     */
    public int fibonacciSequence(int n){
        if(n==1 || n==2){
            return 1;
        }else{
            return fibonacciSequence(n-1)+fibonacciSequence(n-2);
        }
    }

3:汉诺塔 image.png 三根柱子:编号1,2,3,规则是将盘子移动到第三根柱子上,移动过程中必须是小盘子在大盘子上面

//调用
   hanoi(3,1,2,3);
/**
     * @param n      盘子的个数
     * @param start   开始的柱子
     * @param middle   中介柱子
     * @param end      结果柱子
     */
    public static void hanoi(int n,int start,int middle,int end){
        if(n<=1){
            System.out.println(start+"----->"+end);
        }else{
            hanoi(n-1,start,end,middle);
            System.out.println(start+"----->"+end);
            hanoi(n-1,middle,start,end);
        }
    }

汉诺塔执行流程

汉诺塔执行结果

递归调用自己次数问题

  • 调用自己一次: 调用位置前面的代码是正循环,调用位置后面的代码是反循环(递归思想的输出)
  • 调用自己两次 他是一个二叉树的中序遍历过程