《算法》第一章部分程序 part 2
▶ 书中第一章部分程序,加上自己补充的代码,包括简单的计时器,链表背包迭代器,表达式计算相关
● 简单的计时器,分别记录墙上时间和 CPU 时间。
package package01; import java.lang.management.ThreadMXBean;
import java.lang.management.ManagementFactory; public class class01
{
private final ThreadMXBean threadTimer; // CPU 计时器
private final long startWall; // 墙上时间
private final long startCPU; // CPU 时间 public class01() // 构造函数即开始计时
{
startWall = System.currentTimeMillis();
threadTimer = ManagementFactory.getThreadMXBean();
startCPU = threadTimer.getCurrentThreadCpuTime();
} public void elapsedTime() // 停止计时并输出结果
{
long finishWall = System.currentTimeMillis();
long finishCPU = threadTimer.getCurrentThreadCpuTime();
System.out.printf("Wall time: %d ms, CPU time:%d ns\n", finishWall - startWall, finishCPU - startCPU);
} public static void main(String[] args)
{
class01 clock = new class01(); double sum = 0.0;
for (int i = 1; i <= 100000000; i++)
sum += Math.pow(i, 0.5); clock.elapsedTime();
}
}
● 在链表背包数据结构的基础上实现迭代器
package package01; import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import java.util.Iterator;
import java.util.NoSuchElementException; public class class01<Item> implements Iterable<Item>
{
private Node<Item> first; // 头节点
private int n; // 物品数 private static class Node<Item> // 链表结构
{
private Item item;
private Node<Item> next;
} public class01()
{
first = null;
n = 0;
} public boolean isEmpty()
{
return first == null;
} public int size()
{
return n;
} public void add(Item item)
{
Node<Item> oldfirst = first;
first = new Node<Item>();
first.item = item;
first.next = oldfirst;
n++;
} public Iterator<Item> iterator() // 实现迭代器
{
return new ListIterator<Item>(first);
} private class ListIterator<Item> implements Iterator<Item> // 迭代器的基本结构
{
private Node<Item> current;
public ListIterator(Node<Item> first)
{
current = first;
} public boolean hasNext()
{
return current != null;
}
public void remove() // 不含 remove() 方法
{
throw new UnsupportedOperationException();
} public Item next()
{
if (!hasNext())
throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
} public static void main(String[] args)
{
class01<String> bag = new class01<String>();
while (!StdIn.isEmpty())
{
String item = StdIn.readString();
bag.add(item);
} StdOut.println("size of bag = " + bag.size());
for (String s : bag) {
StdOut.println(s);
}
}
}
■ 输入输出要点,在这里使用了 algs4 的 StdIn,需要给出多行的程序输入(用 "<" 重定向的不用考虑这部分)。在命令行中执行 java XXX 后逐行输入,用回车键隔开,全部输入完后回车到新的一行,按 Ctrl + z 结束输入程序自动向下运行;而在 IntelliJ中,点击执行后逐行输入,用回车键隔开,全部输入完后回车到新的一行,按 Ctrl + d 结束输入程序自动向下运行
● 表达式计算相关
package package01; import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.StdIn; public class class01
{
public static double evaluate(String args) // Dijkstra 双栈中缀表达式计算
{
Stack<String> ops = new Stack<String>(); // 算符栈
Stack<Double> vals = new Stack<Double>(); // 操作数栈 for (int i = 0; i<args.length(); i++)
{
String s = args.charAt(i) + ""; if (s.equals("(") || s.equals(" ")) // 跳过左括号和空格
;
else if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || 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); vals.push(v); // 数字压栈,缺点是只能读取一位数字
}
else vals.push(Double.parseDouble(s)); // 计算结果压栈
}
return vals.pop();
} public static String correctBracket(String[] args) // P102, Ex1.3.9,将中缀表达式缺失的左括号补全
{
Stack<String> ops = new Stack<String>();
Stack<String> vals = new Stack<String>(); for (; !StdIn.isEmpty();)
{
String s = StdIn.readString(); if (s.equals("(") || s.equals(" ")) // 左括号,不作任何操作
;
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/") || s.equals("sqrt")) // 运算符,压栈
ops.push(s);
else if (s.equals(")")) // 右括号,吐栈
{
String op = ops.pop();
String v = vals.pop();
if (op.equals("+") || op.equals("-") || op.equals("*") || op.equals("/"))
v = String.format("( %s %s %s )", vals.pop(), op, v);
else if (op.equals("sqrt"))
v = String.format("( %s ( %s ) )", op, v); vals.push(v);
}
else vals.push(s);
//else vals.push(((Double)Double.parseDouble(s)).toString()); // 输出浮点数的情况
}
return vals.pop();
} public static void main(String[] args)// 测试输入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
{
String output1 = correctBracket(args);
double output2 = evaluate(output1);
System.out.printf("%s\n%f\n", output1, output2);
}
}
《算法》第一章部分程序 part 2的更多相关文章
- 《算法》第一章部分程序 part 1
▶ 书中第一章部分程序,加上自己补充的代码,包括若干种二分搜索,寻找图上连通分量数的两种算法 ● 代码,二分搜索 package package01; import java.util.Arrays; ...
- C语言编程入门之--第一章初识程序
第一章 初识程序 导读:计算机程序无时不刻的影响着人类的生活,现代社会已经离不开程序,程序的作用如此巨大,那么程序到底是什么呢?本章主要讨论程序的概念,唤起读者对程序的兴趣,同时对C语言程序与其它语言 ...
- windows核心编程-第一章 对程序错误的处理
第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...
- 第一章 Python程序语言简介
第一节 Python概述 1. 什么是Python Python是一种 解释型.面向对象.动态数据类型 的高级程序设计语言.由Guido van Rossum与1989年发明,第一个公开发行版本发行于 ...
- ASP.NET本质论第一章网站应用程序学习笔记3-对象化的Http
在.NET环境下,万物皆对象,在HttpRuntime收到请求之后,立即将通过HttpWorkerRequest传递的参数进行分析和分解,创建方便用于网站应用程序处理用的对象,其中主要涉及到两个对象类 ...
- ASP.NET本质论第一章网站应用程序学习笔记2
1.初步走进ASP.NET 上篇笔记我们讲述了服务器监听问题,这篇我们就要讲述具体的请求处理了,ASP.NET所涉及的类大多数定义在System.Web程序集中. 在.NET中,程序集管理的最小逻辑单 ...
- ASP.NET本质论第一章网站应用程序学习笔记1
1.统一资源标示符 1) 格式:协议://主机[.端口号][绝对路径[?参数]],在Http://www.kencery.com/hyl/index/login中,http表示协议的名称,www.ke ...
- 《程序是怎样跑起来的》读书笔记——第一章 对程序员来说CPU是什么
1 程序的运行流程 2 CPU的组成 3 寄存器的主要种类和功能 "程序计数器"--决定程序流程的 4 条件分支和循环机制 4.1 顺序执行 4.2 选择分支 5 函数的调用机制 ...
- 【学习总结】java数据结构和算法-第一章-内容介绍和授课方式
总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 几个经典算法面试题 算法和数据结构的重要性 几个经典算法面试题 字符串匹配 暴力法:慢 kmp算法:更 ...
随机推荐
- tomcat源码 分析 Catalina
通过查看分析启动脚本,发现最终调用的入口是org.apache.catalina.startup包下面的Bootstrap#main public static void main(String ar ...
- ALGO-13_蓝桥杯_算法训练_拦截导弹(贪心,DP)
问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- 【AMQ】之安装,启动,访问
1.访问官网下载AMQ 2.解压下载包 windows直接找到系统对应的win32|win64 双击activemq.bat 即可 linux执行 ./activemq start 访问: AMQ默认 ...
- Android开发之内部类篇
内部类: 1.内部类的第一个好处,隐藏你不想让别人知道的操作,也即封装性. 2.非静态内部类对象有着指向其外部类对象的引用 等等. 创建项目: 1.File---->New----->ja ...
- 小程序支持打开APP
根据微信的官方文档,小程序支持打开APP,专门研究了下这个API有什么,官方文档地址如下 https://mp.weixin.qq.com/debug/wxadoc/dev/component/but ...
- 三星GT-N8010刷机教程
本刷机教程只针对三星GT-N8010机器(以下简称GT-N8010),以下操作本人已在GT-N8010机器上亲测,且都成功,其它机器没有测试不能保证成功. 刷机有风险,请谨慎使用!请先备份资料和信息. ...
- [转][CentOS]修改IP后立即生效
来自:http://bbs.51cto.com/thread-789908-1.html Linux系统里修改IP地址后该如何使之即刻生效,有两种方法可以解决: (1) sudo ifdown eth ...
- Maven的classifier作用
classifier可以是任意的字符串,用于拼接在GAV之后来确定指定的文件. 可用于区分不同jdk版本所生成的jar包 <dependency> <groupId>net.s ...
- [UE4]删除UI:Remove from Parent
同时要将保存UI的变量清空,以释放占用的系统内存
- [UE4]用Blenspace混合空间动画代替AimOffset动画偏移