目录
Preface
在学习《算法》第四版中,记录自己做的习题1.3.6,1.3.7,1.3.8,1.3.9,1.3.10的答案,若有错误欢迎提醒。
可以去看看我的GitHub,里面有我的代码和测试,记得star哦!
习题1.3.6
题目描述
下面这段代码对队列q进行了什么操作?
代码
package chapter1;
import edu.princeton.cs.algs4.Queue;
import edu.princeton.cs.algs4.Stack;
/**
*
* 项目名称:Algorithms4
* 类名称:P1_3_06
* 类描述:练习1.3.06,判断代码的作用 :反转队列q中所有元素的顺序
* 创建人:bbbdbbb
* 创建时间:2020年2月3日 下午3:56:15
* @version
*/
public class P1_3_06 {
public static void main(String[] args) {
Queue<String> q = new Queue<String>();
for(int i=0;i<10;i++){
q.enqueue(""+i);
}
System.out.print("程序开始前队列q中的元素:");
for(String s : q){
System.out.print(s+" ");
}
Stack<String> stack = new Stack<String>();
while(!q.isEmpty()){
stack.push(q.dequeue());
}
while(!stack.isEmpty()){
q.enqueue(stack.pop());
}
System.out.print("\n程序结束后队列q中的元素:");
for(String s : q){
System.out.print(s+" ");
}
}
}
运行结果截图
习题1.3.7
题目描述
为Stack添加一个方法peek(),返回栈中最近添加的元素(而不是弹出)
代码
package chapter1;
/**
*
* 项目名称:Algorithms4
* 类名称:P1_3_07
* 类描述:练习1.3.07,为Stack(算法1.2 用链表实现的栈)添加一个方法peek(),
* 返回栈中最近添加的元素(而不弹出它)
* 创建人:bbbdbbb
* 创建时间:2020年2月3日 下午4:12:06
* @version
*/
public class P1_3_07 {
// public Item peek() {
// if (isEmpty()) throw new NoSuchElementException("Stack underflow");
// return first.item;
// }
}
习题1.3.8
题目描述
给定以下输入,给出DoublingStackOfStrings的数组的内容和大小。
it was - the best - of times - - - it was - the - -
代码
package chapter1;
import collection.ResizingArrayStack;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
/**
*
* 项目名称:Algorithms4
* 类名称:P1_3_08
* 类描述:练习1.3.08,给定以下输入,给出DoublingStackOfStrings的数组的内容和大小。
* it was - the best - of times - - - it was - the - -
* 创建人:bbbdbbb
* 创建时间:2020年2月3日 下午4:38:58
* @version
*/
public class P1_3_08 {
//书上并没有看到DoublingStackOfStrings的实现代码,但根据英文名称可以看出:
// 这是一个栈的实现类,栈的容量成倍的增加和减少,这不就是P88算法1.1ResizingArrayStack嘛?
public static void main(String[] args) {
ResizingArrayStack<String> s = new ResizingArrayStack<>();
while(!StdIn.isEmpty()){
String item = StdIn.readString();
if(!item.equals("-")){
s.push(item);
StdOut.println("\n\n输入:"+item);
StdOut.println("栈的长度"+s.size());
StdOut.print("栈中的内容:");
for(String str : s){
StdOut.print(str+" ");
}
}
else if(!s.isEmpty()){
s.pop();
StdOut.println("\n\n输入:"+item);
StdOut.println("栈的长度"+s.size());
StdOut.print("栈中的内容:");
for(String str : s){
System.out.print(str+" ");
}
}
}
StdOut.println("\n剩下的元素数量:"+s.size());
}
}
运行结果截图
设置标准输入:
文件内容:
输出:
习题1.3.9
题目描述
编写一道程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。
例如,给定输入:1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
你的程序应该输出 ((1 + 2) * ((3 - 4) * (5 - 6)))
代码
package chapter1;
import edu.princeton.cs.algs4.Stack;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
/**
*
* 项目名称:Algorithms4
* 类名称:P1_3_09
* 类描述: 练习1.3.09,编写一段程序,从标准输入得到一个缺少左括号的表达式,
* 并打印在出补全括号之后的中序表达式。
* 创建人:bbbdbbb
* 创建时间:2020年2月3日 下午8:26:29
* @version
*/
public class P1_3_09 {
public static void main(String[] args) {
Stack<String> number = new Stack<>();//存储算式中的数字
Stack<String> operator = new Stack<>();//存储算式中的运算符
while(!StdIn.isEmpty()){
String item = StdIn.readString();
System.out.println(item);
if(Character.isDigit(item.charAt(0))){//如果item是数字0~9,压入number栈
number.push(item);
}else if("+".equals(item) || "-".equals(item) || "*".equals(item) || "/".equals(item)){
//如果item是运算符,压入operator栈
operator.push(item);
}else if(")".equals(item) && number.size()>=2 && operator.size()>=1){//如果item是')'
String second = number.pop();
String first = number.pop();
String newBracket = "("+first+operator.pop()+second+")";
number.push(newBracket);
System.out.println("打桩: 1新产生的括号表达式为 "+newBracket);
}else{
//输入数据不能够成一个完整的括号表达式
System.out.println("数据错误!!!");
}
}
if(number.size()==1){
System.out.print("结果:"+number.pop());
}
}
}
运行结果截图
设置标准输入同上。
输出:
习题1.3.10
题目描述
编写一个过滤器InfixToPostfix,将算术表达式由中序表达式转为后序表达式
代码
package chapter1;
/**
*
* 项目名称:Algorithms4
* 类名称:P1_3_10
* 类描述: 练习1.3.10,编写一个过滤器 InfixToPostfix,将算术表达式由中序表达式转为后序表达式
* 参考博客 https://www.jianshu.com/p/a052eb2806a1
* 创建人:bbbdbbb
* 创建时间:2020年2月4日 下午5:08:51
* @version
*/
public class P1_3_10 {
public static void main(String[] args) {
// package collection;
//
// import edu.princeton.cs.algs4.Stack;
// import edu.princeton.cs.algs4.StdIn;
// import edu.princeton.cs.algs4.StdOut;
//
// public class InfixToPostfix {
// public static void main(String[] args) {
// Stack<String> stack = new Stack<String>();
// while (!StdIn.isEmpty()) {
// String s = StdIn.readString();
// if (s.equals("+")) stack.push(s);
// else if (s.equals("-")) stack.push(s);
// else if (s.equals("*")) stack.push(s);
// else if (s.equals("/")) stack.push(s);
// else if (s.equals(")")) StdOut.print(stack.pop() + " ");
// else if (s.equals("(")) StdOut.print("");
// else StdOut.print(s + " ");
// }
// StdOut.println();
// }
// }
}
}
运行结果截图
设置标准输入同上。
输出: