本博客代码示例均来自:算法 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虽然简单,思想很经典。