算法1-背包+双栈算数表达式求值算法


本博客代码示例均来自:算法 Algorithmes Forth Edition
[美] Robert Sedgewick Kevin Wayne 著 谢路云译

一、背包Bag

没用过Bag,也未在实践代码中看到过,不过这里介绍的是一种思想,直接上代码。
Bag特性:无序,不能删除。

package com.chm.algorithms.bagstackqueue;

import edu.princeton.cs.algs4.Bag;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

/**
 * Author:meice Huang
 * Time: 2020/3/7 下午9:51
 */
public class Stats {
    public static void main(String[] args) {
        Bag<Double> numbers = new Bag<>();
        while (!StdIn.isEmpty() && StdIn.readDouble() != 1.11) {
            numbers.add(StdIn.readDouble());//实际操作发现没法终止,所以加了1.11
        }
        int N = numbers.size();
        double sum = 0.0;
        for (double x : numbers) {
            sum += x;
        }
        double mean = sum / N;
        sum = 0.0;
        //标准差:每个值和平均值之差的平方和除以N-1之后的平方根
        for (double x : numbers) {
            sum += (x - mean) * (x - mean);
        }
        double std = Math.sqrt(sum / (N - 1));
        StdOut.printf("Mean: %.2f\n", mean);
        StdOut.printf("Std dev:  %.2f\n", std);
    }

    /**
     * 总结:
     * 1、Bag,这是标准库的包,实际代码中我没看到过用这个的;
     * 2、就是终端输入及时中断,计算过程没
     */
}

二、双栈算数表达式求值算法

初次看到这个名字,就想起了”双马对单车“这种棋谱的感觉…
我把感触和总结都写在代码里了


package com.chm.algorithms.bagstackqueue;

import edu.princeton.cs.algs4.StdIn;

import java.util.Stack;

/**
 * Author:meice Huang
 * Time: 2020/3/7 下午10:47
 * Dijkstra的双栈算术表达式求值算法(二十世纪六十年代)
 */
public class Evaluate {
    public static void main(String[] args) {
        Stack<String> ops = new Stack<>();
        Stack<Double> vals = new Stack<>();
        while (!StdIn.isEmpty() && !StdIn.readString().equals("exist")) {
            String s = StdIn.readString();
            if (s.equals("(")) {

            } else if (s.equals("+")) {
                ops.push(s);
            } else if (s.equals("-")) {
                ops.push(s);
            } else if (s.equals("*")) {
                ops.push(s);
            } else if (s.equals("/")) {
                ops.push(s);
            } else if (s.equals("sqrt")) {
                ops.push(s);
            } else if (s.equals(")")) {
                String op = ops.pop();
                Double v = vals.pop();
                if (op.equals("+")) {
                    v = vals.pop() + v;
                } else if (op.equals("-")) {
                    v = vals.pop() - v;
                } else if (op.equals("*")) {
                    v = vals.pop() * v;
                } else if (op.equals("/")) {
                    v = vals.pop() / v;
                } else if (op.equals("sqrt")) {
                    v = Math.sqrt(v);
                }
            } else if (!s.equals("exist")) {
                vals.push(Double.parseDouble(s));
            }
        }
    }

    /**
     * 总结:
     * 1、通过栈的方式来处理计算问题,且通过)来计算前2个数,思想非常精妙!
     * 2、不知为何我的exist不能中断输入?
     */
}

三、总结

1、书中都是用命令行运行的,如果不清楚或者遇到了障碍,请参考笔者博客https://blog.csdn.net/meiceatcsdn/article/details/104588541

2、code虽然简单,思想很经典。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值