▶ 书中第一章部分程序,加上自己补充的代码,包括简单的计时器,链表背包迭代器,表达式计算相关

● 简单的计时器,分别记录墙上时间和 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的更多相关文章

  1. 《算法》第一章部分程序 part 1

    ▶ 书中第一章部分程序,加上自己补充的代码,包括若干种二分搜索,寻找图上连通分量数的两种算法 ● 代码,二分搜索 package package01; import java.util.Arrays; ...

  2. C语言编程入门之--第一章初识程序

    第一章 初识程序 导读:计算机程序无时不刻的影响着人类的生活,现代社会已经离不开程序,程序的作用如此巨大,那么程序到底是什么呢?本章主要讨论程序的概念,唤起读者对程序的兴趣,同时对C语言程序与其它语言 ...

  3. windows核心编程-第一章 对程序错误的处理

    第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...

  4. 第一章 Python程序语言简介

    第一节 Python概述 1. 什么是Python Python是一种 解释型.面向对象.动态数据类型 的高级程序设计语言.由Guido van Rossum与1989年发明,第一个公开发行版本发行于 ...

  5. ASP.NET本质论第一章网站应用程序学习笔记3-对象化的Http

    在.NET环境下,万物皆对象,在HttpRuntime收到请求之后,立即将通过HttpWorkerRequest传递的参数进行分析和分解,创建方便用于网站应用程序处理用的对象,其中主要涉及到两个对象类 ...

  6. ASP.NET本质论第一章网站应用程序学习笔记2

    1.初步走进ASP.NET 上篇笔记我们讲述了服务器监听问题,这篇我们就要讲述具体的请求处理了,ASP.NET所涉及的类大多数定义在System.Web程序集中. 在.NET中,程序集管理的最小逻辑单 ...

  7. ASP.NET本质论第一章网站应用程序学习笔记1

    1.统一资源标示符 1) 格式:协议://主机[.端口号][绝对路径[?参数]],在Http://www.kencery.com/hyl/index/login中,http表示协议的名称,www.ke ...

  8. 《程序是怎样跑起来的》读书笔记——第一章 对程序员来说CPU是什么

    1 程序的运行流程 2 CPU的组成 3 寄存器的主要种类和功能 "程序计数器"--决定程序流程的 4 条件分支和循环机制 4.1 顺序执行 4.2 选择分支 5 函数的调用机制 ...

  9. 【学习总结】java数据结构和算法-第一章-内容介绍和授课方式

    总目录链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 几个经典算法面试题 算法和数据结构的重要性 几个经典算法面试题 字符串匹配 暴力法:慢 kmp算法:更 ...

随机推荐

  1. 关于高并发下kafka producer send异步发送耗时问题的分析

    最近开发网关服务的过程当中,需要用到kafka转发消息与保存日志,在进行压测的过程中由于是多线程并发操作kafka producer 进行异步send,发现send耗时有时会达到几十毫秒的阻塞,很大程 ...

  2. ASP.NET中使用JSON方便实现前台与后台的数据交换

    ASP.NET中使用JSON方便实现前台与后台的数据交换 发表于2014/9/13 6:47:08  8652人阅读 分类: ASP.NET Jquery extjs 一.前台向后台请求数据 在页面加 ...

  3. 解析H5本地储存Web Storage

    一.本地存储由来的背景 由于HTML4时代Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的部分信息,那么只能借助于Cookie.但是Cookie的这些限制,也就导致了C ...

  4. LeetCode——7. Reverse Integer

    一.题目链接:https://leetcode.com/problems/reverse-integer/ 二.题目大意: 给定一个整数,要求反转该整数之后再返回:如果归返回的整数超过了int型整数的 ...

  5. SpringBoot之退出服务(exit)时调用自定义的销毁方法

    我们在工作中有时候可能会遇到这样场景,需要在退出容器的时候执行某些操作.SpringBoot中有两种方法可以供我们来选择(其实就是spring中我们常用的方式.只是destory-method是在XM ...

  6. 【深度学习】BP反向传播算法Python简单实现

    转载:火烫火烫的 个人觉得BP反向传播是深度学习的一个基础,所以很有必要把反向传播算法好好学一下 得益于一步一步弄懂反向传播的例子这篇文章,给出一个例子来说明反向传播 不过是英文的,如果你感觉不好阅读 ...

  7. Global配置接口访问日志以及测试日志记录

    在客户端请求接口时,经常会出现接口相应慢,接口等待超时,接口错误,为了这事相信不少后台开发者为此背锅,记下请求日志,拿出有力证据这才是关键. 1.接口请求错误记录 很多时候接口请求出现的500,404 ...

  8. vo和pojo

    pojo直接描述数据库中的表和字段,一一对应 vo的话,可以多添加些属性,比如code对应的name,或者标识符等等 查询列表的时候也可以直接用vo,但是修改或添加记录必须是pojo QueryVo ...

  9. etcd集群部署与遇到的坑(转)

    原文 https://www.cnblogs.com/breg/p/5728237.html etcd集群部署与遇到的坑 在k8s集群中使用了etcd作为数据中心,在实际操作中遇到了一些坑.今天记录一 ...

  10. python基础介绍

    一. 1.计算机基础 cpu:运算和控制:速度:飞机 内存:临时存储,供给cup数据,断电数据清空.成本高,速度:高铁 硬盘:相当于电脑的数据库,存储大量数据,数据永久保存(除非物理结构被破坏).速度 ...