《算法》第一章部分程序 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算法:更 ...
随机推荐
- Redis环境安装
Windows下: 到https://github.com/MicrosoftArchive/redis/releases下载: 下载完成后一步一步安装就行. 然后在安装一个可视化工具:https:/ ...
- sqlserver统计日志数目
SELECT COUNT(1) FROM [sys].[fn_dblog](NULL,NULL)
- windows安装mysql数据库并修改密码
1.下载 MySQL Community Server https://dev.mysql.com/downloads/mysql/ 2.解压 如果想要让MySQL安装在指定目录,那么就将解压后的文件 ...
- SpringBoot使用redis缓存List
一.概述 最近在做性能优化,之前有一个业务是这样实现的: 1.温度报警后第三方通讯管理机直接把报警信息保存到数据库: 2.我们在数据库中添加触发器,(BEFORE INSERT)根据这条报警信息处理业 ...
- 关于JAVA架构师
在我们行业内,我们大致把程序员分为四级 1.初级Java程序员的重心在编写代码.运用框架: 2.中级Java程序员重心在编写代码和框架: 3.高级Java程序员技术攻关.性能调优: 4.架构师 解决业 ...
- Nexus3.6版私服搭建安装与配置教程
1.本地环境配置(Nexus3.6支持jdk版本1.6.1.7.1.8) 1.1.官网下载地址:https://www.sonatype.com/download-oss-sonatype ...
- 【剑指offer】字符串替换
请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. *StringBuffer 扩容 str ...
- boost::function用法详解
要开始使用 Boost.Function, 就要包含头文件 "boost/function.hpp", 或者某个带数字的版本,从 "boost/function/func ...
- 数据类型---列表,for循环
定义:列表是一个数据的集合,集合内可以放任何数据类型,可对集合进行方便的增删改查操作. L1=[] #定义空列表 L2=[1,2,3,4] #存4个值,索引为0-3 L3= ["ab ...
- 廖雪峰Java3异常处理-2断言和日志-2使用JDK Logging
1.日志 为了取代System.out.println() 可以设置输出样式 可以设置输出级别,禁止某些级别输出 可以被重定向到文件 可以按包名控制日志级别 2.JDK内置Logging 在java. ...