算法第四版习题解答(1.3 Bags, Queues, adn Stacks)

article/2025/9/15 22:01:45

前言

使用的是《算法》第四版英文版,主要是习题解答。

书中jar包的导入请戳:算法(第四版)中algs4.jar下载和使用

EXERCISES

1.3.1

public class FixedCapacityStackOfStrings {private String[] a;     // stack entriesprivate int N;          // sizepublic FixedCapacityStackOfStrings(int cap) {a = new String[cap];}public boolean isEmpty() {return N == 0;}public int size() {return N;}public void push(String item) {a[N++] = item;}public String pop() {return a[--N];}// 添加的方法public boolean isFull() {return N == a.length;}
}

1.3.2

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;import java.util.Iterator;public class Stack<T> implements Iterable<T> {private Node first;     // top of stack (most recently added node)private int N;          // number of itemsprivate class Node {T item;Node next;}public boolean isEmpty() {return first == null;}public int size() {return N;}public void push(T item) {Node oldFirst = first;first = new Node();first.item = item;first.next = oldFirst;N++;}public T pop() {T item = first.item;first = first.next;N--;return item;}@Overridepublic Iterator<T> iterator() {return new ListIterator();}private class ListIterator implements Iterator<T> {private Node current = first;public boolean hasNext() {return current != null;}public void remove() { }public T next() {T item = current.item;current = current.next;return item;}}public static void main(String[] args) {Stack<String> s = new Stack<String>();while (!StdIn.isEmpty()) {String item = StdIn.readString();if (!item.equals("-"))s.push(item);else if (!s.isEmpty())StdOut.print(s.pop() + " ");}StdOut.println("(" + s.size() + " left on stack)");}
}

1.3.3

b、f、g

1.3.4

import java.util.Scanner;public class Parentheses {public static void main(String[] args) {Scanner in = new Scanner(System.in);String s = in.nextLine();Stack<Character> sk = new Stack<>();boolean res = true;for (int i = 0; i < s.length() && res; i++) {// 左括号入栈if (s.charAt(i) == '{' || s.charAt(i) == '[' || s.charAt(i) == '(')sk.push(s.charAt(i));if (!sk.isEmpty()) {if (s.charAt(i) == '}' && sk.pop() != '{')res = false;if (s.charAt(i) == ']' && sk.pop() != '[')res = false;if (s.charAt(i) == ')' && sk.pop() != '(')res = false;}if (sk.isEmpty() && (s.charAt(i) == ')' || s.charAt(i) == ']' || s.charAt(i) == '}'))res = false;}System.out.println(res);}
}

1.3.5

在这里插入图片描述

1.3.6

将队列中的元素进行逆序

1.3.7

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;import java.util.Iterator;public class Stack<T> implements Iterable<T> {.........			// 省略部分同1.3.2public T peek() {return first.item;}
}

1.3.8

import edu.princeton.cs.algs4.StdIn;import java.util.Iterator;public class DoublingStackOfStrings<T> implements Iterable<T> {private T[] a = (T[]) new Object[1];private int n;public int size() {return n;}public boolean isEmpty() {return n == 0;}public void push(T item) {if (n == a.length)resize(2 * n);a[n++] = item;}public T pop() {T item = a[--n];a[n] = null;if (n > 0 && n == a.length / 4)resize(2 * n);return item;}public int arraySize() {return a.length;}public void resize(int max) {T[] items = (T[]) new Object[max];for (int i = 0; i < n; i++) {items[i] = a[i];}a = items;}@Overridepublic Iterator<T> iterator() {return new ArrayIterator();}private class ArrayIterator implements Iterator<T> {private int i = n - 1;@Overridepublic boolean hasNext() {return i >= 0;}@Overridepublic T next() {return a[i--];}}public static void main(String[] args) {DoublingStackOfStrings<String> sk = new DoublingStackOfStrings<>();String[] inputs = StdIn.readAllStrings();for (int i = 0; i < inputs.length; i++) {if (inputs[i].equals("-"))sk.pop();elsesk.push(inputs[i]);}for (String s : sk)System.out.println(s + " ");System.out.println("ArraySize: " + sk.arraySize());}
}

1.3.9

import java.util.Scanner;// 我个人理解应该就是每遇到一个右括号,就取数字栈栈顶两个数字和符号栈一个运算符号
public class Solution {public static void main(String[] args) {Scanner in = new Scanner(System.in);String str = in.nextLine();String[] inputs = str.split(" ");Stack<String> sk1 = new Stack<>();       // 存储数字Stack<String> sk2 = new Stack<>();       // 存储运算符号for (String s : inputs) {if (isOperator(s))sk2.push(s);else if (s.equals(")")) {String num1 = sk1.pop();String num2 = sk1.pop();String op = sk2.pop();sk1.push("(" + num2 + " " + op + " " + num1 + ")");} elsesk1.push(s);}System.out.println(sk1.pop());}private static boolean isOperator(String s) {return (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"));}
}

1.3.10

import java.util.Scanner;
import java.util.Stack;public class Solution {public static void main(String[] args) {Scanner in = new Scanner(System.in);String str = in.nextLine();System.out.println(InfixToPostfix(str));}public static String InfixToPostfix(String str) {String[] inputs = str.split(" ");Stack<String> sk = new Stack<>();StringBuilder res = new StringBuilder();for (String s : inputs) {if (isOperator(s))sk.push(s);else if (s.equals("("))continue;else if (s.equals(")"))res.append(sk.pop());elseres.append(s);}return res.toString();}private static boolean isOperator(String s) {return (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"));}
}

1.3.11

import java.util.Scanner;
import java.util.Stack;public class EvaluatePostfix {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 输入的后缀表达式每个字符用空格隔开String str = in.nextLine();Stack<String> sk = new Stack<>();String[] inputs = str.split(" ");for (String s : inputs) {// 遇到运算符,从栈中弹出两个数字进行运算if (isOperator(s)) {int num1 = Integer.parseInt(sk.pop());int num2 = Integer.parseInt(sk.pop());if (s.equals("+"))sk.push(Integer.toString(num1 + num2));if (s.equals("-"))sk.push(Integer.toString(num1 - num2));if (s.equals("*"))sk.push(Integer.toString(num1 * num2));if (s.equals("/")) {if (num2 == 0)throw new ArithmeticException("divide by zero");elsesk.push(Integer.toString(num1 / num2));}} elsesk.push(s);}System.out.println(sk.pop());}private static boolean isOperator(String s) {return (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/"));}
}

1.3.12

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;import java.util.Iterator;public class Stack<T> implements Iterable<T> {...			// 省略部分同1.3.7......public static <T> Stack<T> copy(Stack<T> sk) {Iterator<T> it = sk.iterator();Stack<T> res = new Stack<>();Stack<T> temp = new Stack<>(); while (it.hasNext())temp.push(it.next());it = temp.iterator();while (it.hasNext())res.push(it.next());return res;}
}

1.3.13

b、c、d

1.3.14

public class ResizingArrayOfStrings {private int first;private int last;private int size;private String[] data;public ResizingArrayOfStrings() {first = 0;last = 0;size = 1;data = new String[size];}public boolean isEmpty() {return first == last;}public int getSize() {return last - first;}public void enqueue(String s) {if (last == size)resizing(2 * getSize());data[last++] = s;}public String dequeue() {if (getSize() < size / 4)resizing(2 * getSize());return data[first++];}private void resizing(int n) {String[] temp = new String[n];int index = 0;for (int i = first; i < last; i++)temp[index++] = data[i];data = temp;size = n;last = last - first;first = 0;}
}

1.3.15

import java.util.Iterator;
import java.util.Scanner;public class MyQueue<T> implements Iterable<T> {private Node first;private Node last;private int n;private class Node {T item;Node next;}public boolean isEmpty() {return n == 0;}public int size() {return n;}public void enqueue(T item) {Node oldLast = last;last = new Node();last.item = item;last.next = null;if (isEmpty())first = last;elseoldLast.next = last;n++;}public T dequeue() {T res = first.item;first = first.next;if (isEmpty())last = null;n--;return res;}@Overridepublic Iterator<T> iterator() {return new QueueIterator();}private class QueueIterator implements Iterator<T> {private Node cur = first;@Overridepublic boolean hasNext() {return cur != null;}@Overridepublic T next() {T res = cur.item;cur = cur.next;return res;}}// 将所有输入的字符串入队,队列大小为n// 然后将n - k个字符串出队,最后队列的出队字符串即为倒数第K个字符串public static void main(String[] args) {Scanner in = new Scanner(System.in);int k = in.nextInt();MyQueue<String> myQueue = new MyQueue<>();while (in.hasNext()) myQueue.enqueue(in.next());int size = myQueue.size();for (int i = 0; i < size - k; i++) {myQueue.dequeue();}System.out.println(myQueue.dequeue());}
}

1.3.16

public class Date {private int year;private int month;private int day;public Date(int year, int month, int day) {this.year = year;this.month = month;this.day = day;}public Date(String date) {String[] inputs = date.split("/");if (inputs.length != 3)throw new IllegalArgumentException("Arguments illegal!");month = Integer.parseInt(inputs[0]);day = Integer.parseInt(inputs[1]);year = Integer.parseInt(inputs[2]);}public int getYear() {return year;}public int getMonth() {return month;}public int getDay() {return day;}@Overridepublic String toString() {return getMonth() + "/" + getDay() + "/" + getYear();}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null) return false;if (this.getClass() != o.getClass()) return false;Date that = (Date) o;if (this.day != that.day) return false;if (this.month != that.month) return false;if (this.year != that.year) return false;return true;}public static Date[] readDates(String date) {String[] inputs = date.split(" ");int length = inputs.length;MyQueue<Date> myQueue = new MyQueue<>();for (int i = 0; i < length; i++) {myQueue.enqueue(new Date(inputs[i]));}Date[] res = new Date[length];for (int i = 0; i < length; i++) {res[i] = myQueue.dequeue();}return res;}
}

1.3.17

class Transaction implements Comparable<Transaction> {private String name;private Date date;private double amount;private String transaction;public Transaction(String name, Date date, double amount) {this.name = name;this.date = date;this.amount = amount;}public Transaction(String transaction) {this.transaction = transaction;}public String getName() {return name;}public Date getDate() {return date;}public double getAmount() {return amount;}@Overridepublic String toString() {return "Transaction{" + getName() + " " + getDate() + " " + getAmount() + "}";}@Overridepublic int compareTo(Transaction o) {if (this.amount > o.amount)return 1;else if (this.amount < o.amount)return -1;elsereturn 0;}
}

LINKED-LIST EXERCISES

1.3.18

1.3.19

public class LinkedList<T> {private Node first;private int size;private class Node {T item;Node next;}public void deleteLastNode() {Node cur = first;if (cur == null)return;Node curNext = cur.next;if (curNext == null)first = null;while (curNext.next != null) {cur = curNext;curNext = curNext.next;}cur.next = null;}
}

1.3.20

public class LinkedList<T> {private Node first;private int size;private class Node {T item;Node next;}public void delete(int k) {if (k <= 0 || first == null)return;if (k == 1) {first = first.next;return;}k--;Node cur = first;// 查找到第K-1个元素while (cur != null && --k != 0)cur = cur.next;// 整个链表长度小于kif (k != 0 || cur == null || cur.next == null)return;else    // 正常删除cur.next = cur.next.next;}
}

1.3.21

import java.util.LinkedList;public class Solution {public static <T> boolean find(LinkedList<T> first, String key) {for (T item : first) {if (item.equals(key))return true;}return false;}
}

1.3.22

1.3.23

1.3.24

public class MyLinkedList<T> {private Node<T> first;private int size;private class Node<T> {T item;Node<T> next;}public void removeAfter(Node<T> node) {if (node == null || node.next == null)return;Node<T> cur = node.next;node.next = null;while (cur != null) {Node<T> temp = cur.next;cur.next = null;cur = temp;}}
}

1.3.25

public class MyLinkedList<T> {private Node<T> first;private int size;private class Node<T> {T item;Node<T> next;}public void insertAfter(Node<T> list1, Node<T> list2) {if (list1 == null || list2 == null)return;list2.next = list1.next;list1.next = list2;}
}

1.3.26

public class MyLinkedList<T> {private Node first;private int size;private class Node {T item;Node next;}public void remove(Node node, String key) {while (node != null && key.equals(node.item))node = node.next;Node cur = node;while (cur != null && cur.next != null) {Node curNext = cur.next;if (key.equals(curNext.item))cur.next = curNext.next;elsecur = curNext;}}
}

1.3.27

public class MyLinkedList {private Node first;private int size;private class Node {int item;Node next;}public int max(Node node) {int res = 0;while (node != null) {if (node.item > res)res = node.item;node = node.next;}return res;}
}

1.3.28

public class MyLinkedList<T> {private Node<T> first;private int size;private static class Node<T> {T item;Node<T> next;//	构造函数Node(T item, Node<T> next) {this.item = item;this.next = next;}}public int max(Node<Integer> node) {if (node.next == null)return node.item;else {int res = max(node.next);return res > node.item ? res : node.item;}}
}

1.3.29

import java.util.Iterator;
import java.util.NoSuchElementException;public class CircularQueue<T> implements Iterable<T> {private Node<T> last;private int size;private static class Node<T> {T item;Node<T> next;}public CircularQueue() {last = null;size = 0;}public boolean isEmpty() {return last == null;}public T dequeue() {if (isEmpty())throw new UnsupportedOperationException("Queue is empty!");T item = last.next.item;if (last.next == last)last = null;elselast.next = last.next.next;return item;}public void enqueue(T item) {Node<T> node = new Node<>();node.item = item;if (last == null) {last = node;node.next = node;} else {node.next = last.next;last.next = node;last = node;}}public int size() {return size;}@Overridepublic Iterator<T> iterator() {return new CircularQueueIterator(last, size());}private class CircularQueueIterator implements Iterator<T> {private Node<T> first;private int size;public CircularQueueIterator(Node<T> first, int size) {if (last == null)this.first = null;elsethis.first = first;this.size = size;}@Overridepublic boolean hasNext() {return size > 0;}@Overridepublic T next() {if (!hasNext())throw new NoSuchElementException();T item = first.item;first = first.next;--size;return item;}}
}

1.3.30

1.3.31

答案请戳:算法(Algorithms)第4版 练习 1.3.31

CREATIVE PROBLEMS

1.3.32

import java.util.Iterator;public class Steque<T> implements Iterable<T> {private Node first;private Node last;private int size;private class Node {T item;Node next;}// 头部添加元素public void push(T item) {Node node = new Node();node.item = item;if (isEmpty()) {first = node;last = node;node.next = null;} else {node.next = first;first = node;}++size;}// 头部删除元素public T pop() {if (isEmpty())throw new UnsupportedOperationException("Steque is empty!");T item = first.item;first = first.next;--size;return item;}// 尾部添加元素public void enqueue(T item) {Node node = new Node();node.item = item;node.next = null;if (isEmpty()) {first = node;} else {last.next = node;}last = node;++size;}public boolean isEmpty() {return first == null;}public int size() {return size;}@Overridepublic Iterator<T> iterator() {return new StequeIterator();}private class StequeIterator implements Iterator<T> {private Node cur = first;@Overridepublic boolean hasNext() {return cur != null;}@Overridepublic T next() {T item = cur.item;cur = cur.next;return item;}}public static void main(String[] args) {Steque<String> s = new Steque<>();s.enqueue("a");s.enqueue("b");s.push("c");s.push("d");System.out.println("Steque: ");Iterator<String> it = s.iterator();while (it.hasNext())System.out.println(it.next());System.out.println("pop");while (!s.isEmpty())System.out.println(s.pop());}
}

1.3.33

import java.util.Iterator;public class Deque<T> implements Iterable<T> {private Node head;private Node tail;private int size;private class Node {T item;Node prev;Node next;}public boolean isEmpty() {return size == 0;}public int size() {return size;}public void pushLeft(T item) {Node node = new Node();node.item = item;node.prev = null;if (isEmpty()) {head = tail = node;node.next = null;} else {head.prev = node;node.next = head;head = node;}++size;}public void pushRight(T item) {Node node = new Node();node.item = item;node.next = null;if (isEmpty()) {head = tail = node;node.prev = null;} else {tail.next = node;node.prev = tail;tail = node;}++size;}public T popLeft() {if (isEmpty())throw new UnsupportedOperationException("Deque is empty!");T item = head.item;if (size() == 1)head = tail = null;else {head = head.next;head.prev.next = null;head.prev = null;}--size;return item;}public T popRight() {if (isEmpty())throw new UnsupportedOperationException("Deque is empty!");T item = tail.item;if (size() == 1)head = tail = null;else {tail = tail.prev;tail.next.prev = null;tail.next = null;}--size;return item;}@Overridepublic Iterator<T> iterator() {return new DequeIterator();}private class DequeIterator implements Iterator<T> {private Node cur = head;@Overridepublic boolean hasNext() {return cur != null;}@Overridepublic T next() {T item = cur.item;cur = cur.next;return item;}}
}

1.3.34

import edu.princeton.cs.algs4.StdRandom;import java.util.Iterator;public class RandomBag<T> implements Iterable<T> {private T[] data = (T[]) new Object[1];private int size;public boolean isEmpty() {return size == 0;}public int size() {return size;}public void add(T item) {if (size == data.length)resize(2 * data.length);data[size++] = item;}private void resize(int max) {T[] temp = (T[]) new Object[max];for (int i = 0; i < size; i++) {temp[i] = data[i];}data = temp;}@Overridepublic Iterator<T> iterator() {return new RandomBagIterator();}private class RandomBagIterator implements Iterator<T> {private int[] seq = new int[size];private int index = 0;public RandomBagIterator() {for (int i = 0; i < seq.length; i++) {seq[i] = i;}StdRandom.shuffle(seq);}@Overridepublic boolean hasNext() {return index < size;}@Overridepublic T next() {return data[seq[index++]];}}
}

1.3.35

import edu.princeton.cs.algs4.StdRandom;import java.util.Iterator;public class RandomQueue<T> implements Iterable<T> {private T[] data;private int size;// 这次使用构造函数public RandomQueue() {data = (T[]) new Object[1];size = 0;}public RandomQueue(int capacity) {data = (T[]) new Object[capacity];size = 10;}public int size() {return size;}public boolean isEmpty() {return size == 0;}public void enqueue(T item) {if (size == data.length)resize(2 * data.length);data[size++] = item;}private void resize(int max) {T[] temp = (T[]) new Object[max];for (int i = 0; i < size; i++) {temp[i] = data[i];}data = temp;}public T dequeue() {if (this.isEmpty())throw new UnsupportedOperationException("RandomQueue is empty!");if (size == data.length / 4)resize(data.length / 2);int index = StdRandom.uniform(size);T item = data[index];data[index] = data[--size];data[size] = null;return item;}public T sample() {if (this.isEmpty())throw new UnsupportedOperationException("RandomQueue is empty!");int index = StdRandom.uniform(size);return data[index];}@Overridepublic Iterator<T> iterator() {return new RandomQueueIterator();}private class RandomQueueIterator implements Iterator<T> {private T[] temp;private int index;public RandomQueueIterator() {temp = (T[]) new Object[size];for (int i = 0; i < size; i++) {temp[i] = data[i];}StdRandom.shuffle(temp);index = 0;}@Overridepublic boolean hasNext() {return index < size;}@Overridepublic T next() {return temp[index++];}}public static void main(String[] args) {RandomQueue<Integer> randomQueue = new RandomQueue<>();randomQueue.enqueue(1);randomQueue.enqueue(2);randomQueue.enqueue(3);randomQueue.enqueue(4);randomQueue.enqueue(5);for (int i : randomQueue) {System.out.print(i + " ");}System.out.println();System.out.println(randomQueue.sample());for (int i : randomQueue) {System.out.print(i + " ");}System.out.println();System.out.println(randomQueue.sample());System.out.println(randomQueue.sample());System.out.println(randomQueue.dequeue());for (int i : randomQueue) {System.out.print(i + " ");}}}

1.3.36

代码在1.3.35

1.3.37

import edu.princeton.cs.algs4.StdRandom;import java.util.Scanner;// 找不到自己写的Queue了.....
public class Josephus {public static void main(String[] args) {Scanner in = new Scanner(System.in);int N = in.nextInt();int M = in.nextInt();int[] nums = new int[N];for (int i = 0; i < N; i++) {nums[i] = i;}StdRandom.shuffle(nums);for (int i = 0; i < N; i++) {System.out.print(nums[i] + " ");}System.out.println();boolean[] flag = new boolean[N];    // 标记是否被移除for (int i = 0; i < N; i++) {flag[i] = false;}int count = 1;while (count <= N) {int index = count * M - 1;if (!flag[index % N]) {flag[index % N] = true;count++;}}int res = -1;for (int i = 0; i < N; i++) {if (flag[i])res = nums[i];}System.out.println(res);}}

1.3.38

import java.util.Iterator;public class GeneralizedQueue<T> implements Iterable<T> {private T[] data;private int size;public GeneralizedQueue() {data = (T[]) new Object[1];size = 0;}public boolean isEmpty() {return size == 0;}public int size() {return size;}public void insert(T item) {if (size == data.length)resize(2 * size);data[size++] = item;}private void resize(int max) {T[] temp = (T[]) new Object[max];for (int i = 0; i < size; i++) {temp[i] = data[i];}data = temp;}public T delete(int k) {if (k > size || k <= 0)throw new ArrayIndexOutOfBoundsException("k is bigger than queue size, less than zero or equals zero!");if (size == data.length / 4)resize(data.length / 2);T[] temp = (T[]) new Object[size];T res = data[k - 1];for (int i = 0; i < k - 1; i++) {temp[i] = data[i];}for (int i = k - 1; i < size - 1; i++) {temp[i] = data[i + 1];}data = temp;data[--size] = null;return res;}@Overridepublic Iterator<T> iterator() {return new GeneralizedQueueIterator();}private class GeneralizedQueueIterator implements Iterator<T> {private T[] temp;private int index;public GeneralizedQueueIterator() {temp = (T[]) new Object[size];for (int i = 0; i < size; i++) {temp[i] = data[i];}index = 0;}@Overridepublic boolean hasNext() {return index < size;}@Overridepublic T next() {return temp[index++];}}public static void main(String[] args) {GeneralizedQueue<Integer> queue = new GeneralizedQueue<>();queue.insert(1);queue.insert(2);queue.insert(3);queue.insert(4);for (int i : queue) {System.out.print(i + " ");}System.out.println();queue.delete(4);for (int i : queue) {System.out.print(i + " ");}System.out.println();}
}

1.3.39

import java.util.Iterator;// 对于循环队列而言,如果lo指向队头,hi指向队尾,当lo和hi相等时,无法判断队列为空还是满
public class RingBuffer<T> implements Iterable<T> {private T[] data;private int lo;     // 指向队头private int hi;     // 指向队尾元素的下一个位置public RingBuffer() {data = (T[]) new Object[10];lo = 0;hi = 0;}public RingBuffer(int capacity) {data = (T[]) new Object[capacity];lo = 0;hi = 0;}public boolean isEmpty() {return lo == hi;}public boolean isFull() {return (hi + 1) % data.length == lo;}public void enqueue(T item) {if (isFull())System.out.println("RingBuffer is full, please wait!");else {data[hi] = item;hi = (hi + 1) % data.length;}}public T dequeue() {if (isEmpty())throw new UnsupportedOperationException("RingBuffer is Empty!");T res = data[lo];lo = (lo + 1) % data.length;return res;}@Overridepublic Iterator<T> iterator() {return new RingBufferIterator();}private class RingBufferIterator implements Iterator<T> {private T[] temp;private int index;public RingBufferIterator() {int size = hi - lo;temp = (T[]) new Object[size];for (int i = 0, j = lo; i < size; i++) {temp[i] = data[j++];}index = 0;}@Overridepublic boolean hasNext() {return index < hi - lo;}@Overridepublic T next() {return temp[index++];}}public static void main(String[] args) {RingBuffer<Integer> ringBuffer = new RingBuffer<>();ringBuffer.enqueue(1);ringBuffer.enqueue(2);ringBuffer.enqueue(3);ringBuffer.enqueue(4);for (int i : ringBuffer) {System.out.print(i + " ");}System.out.println();ringBuffer.dequeue();for (int i : ringBuffer) {System.out.print(i + " ");}System.out.println();}
}

1.3.40

import java.util.Iterator;public class MoveToFront<T> implements Iterable<T> {private Node first;private int size;private class Node {T item;Node prev;Node next;public Node(T item) {this.item = item;prev = null;next = null;}}public MoveToFront() {first = null;size = 0;}public boolean isEmpty() {return size == 0;}public int size() {return size;}public void add(T item) {Node node = new Node(item);if (isEmpty())first = node;else {Node cur = first;while (cur != null) {if (cur.item == item) {if (cur == first) {first = cur.next;first.prev = null;} else if (cur.next == null) {cur.prev.next = null;} else {cur.prev.next = cur.next;cur.next.prev = cur.prev;}size--;}cur = cur.next;}node.next = first;first.prev = node;first = node;}size++;}@Overridepublic Iterator<T> iterator() {return new MoveToFrontIterator();}private class MoveToFrontIterator implements Iterator<T> {private Node temp;public MoveToFrontIterator() {temp = first;}@Overridepublic boolean hasNext() {return temp != null;}@Overridepublic T next() {T res = temp.item;temp = temp.next;return res;}}public static void main(String[] args) {MoveToFront<Integer> moveToFront = new MoveToFront<>();moveToFront.add(1);moveToFront.add(2);moveToFront.add(3);moveToFront.add(4);for (int i : moveToFront) {System.out.print(i + " ");}System.out.println();moveToFront.add(3);for (int i : moveToFront) {System.out.print(i + " ");}System.out.println();}
}

1.3.41

import java.util.Iterator;public class Queue<T> implements Iterable<T> {private Node first;private Node last;private int size;private class Node {T item;Node next;public Node(T item) {this.item = item;next = null;}}public Queue() {first = null;last = null;size = 0;}public boolean isEmpty() {return size == 0;}public int size() {return size;}public Queue(Queue<T> q) {int size = q.size();for (int i = 0; i < size; i++) {T item = q.dequeue();enqueue(item);q.enqueue(item);}}public void enqueue(T item) {Node node = last;last = new Node(item);if (isEmpty())first = last;elsenode.next = last;size++;}public T dequeue() {T item = first.item;first = first.next;if (isEmpty())last = null;size--;return item;}@Overridepublic Iterator<T> iterator() {return new QueueIterator();}private class QueueIterator implements Iterator<T> {private Node cur = first;@Overridepublic boolean hasNext() {return cur != null;}@Overridepublic T next() {T res = cur.item;cur = cur.next;return res;}}public static void main(String[] args) {Queue<Integer> q = new Queue<>();for (int i = 0; i < 10; i++) {q.enqueue(i);}Queue<Integer> r = new Queue<>(q);int size = q.size;for (int i = 0; i < size; i++) {System.out.print(q.dequeue() + " ");}System.out.println();for (int i : r) {System.out.print(i + " ");}System.out.println();}
}

1.3.42

import java.util.Iterator;public class Stack<T> implements Iterable<T> {private Node first;     // top of stack (most recently added node)private int size;          // number of itemsprivate class Node {T item;Node next;}public Stack() {first = null;size = 0;}public Stack(Stack<T> s) {Stack<T> temp = new Stack<>();while (!s.isEmpty()) {temp.push(s.pop());}while (!temp.isEmpty()) {T item = temp.pop();push(item);s.push(item);}}public boolean isEmpty() {return first == null;}public int size() {return size;}public void push(T item) {Node oldFirst = first;first = new Node();first.item = item;first.next = oldFirst;size++;}public T pop() {T item = first.item;first = first.next;size--;return item;}@Overridepublic Iterator<T> iterator() {return new ListIterator();}private class ListIterator implements Iterator<T> {private Node current = first;@Overridepublic boolean hasNext() {return current != null;}@Overridepublic T next() {T item = current.item;current = current.next;return item;}}public static void main(String[] args) {Stack<Integer> s = new Stack<>();s.push(1);s.push(2);s.push(3);s.push(4);for (int i : s) {System.out.print(i + " ");}System.out.println();Stack<Integer> t = new Stack<>(s);for (int i : t) {System.out.print(i + " ");}System.out.println();}
}

1.3.43

import java.io.File;
import java.util.Iterator;
import java.util.Scanner;public class ListingFiles implements Iterable {private FileNode first;private FileNode last;private int size;private class FileNode {String item;FileNode next;}public ListingFiles(String pathName) {generateList(pathName);}public void generateList(String pathName) {File file = new File(pathName);if (!file.isDirectory()) {FileNode newLast = new FileNode();newLast.item = file.getName();if (first == null) {first = newLast;last = newLast;} else {last.next = newLast;last = newLast;}size++;} else {File[] files = file.listFiles();for (File file1 : files) {generateList(file1.getPath());}}}@Overridepublic Iterator iterator() {return new ListingFilesIterator();}private class ListingFilesIterator implements Iterator {private FileNode cur = first;@Overridepublic boolean hasNext() {return cur != null;}@Overridepublic String next() {String s = cur.item;cur = cur.next;return s;}}public static void main(String[] args) {Scanner in = new Scanner(System.in);String pathName = in.nextLine();ListingFiles folder = new ListingFiles(pathName);for (Object o : folder) {System.out.println(o);}}
}

1.3.44

// 光标位置为左栈的栈顶指针位置,向左向右移动用栈push、pop来模拟光标的移动
public class Buffer {Stack<Character> leftStack;Stack<Character> rightStack;public Buffer() {leftStack = new Stack<>();rightStack = new Stack<>();}public void insert(char c) {leftStack.push(c);}public char delete() {return leftStack.pop();}public void left(int k) {if (k > leftStack.size())return;for (int i = 0; i < k; i++) {rightStack.push(leftStack.pop());}}public void right(int k) {if (k > rightStack.size())return;for (int i = 0; i < k; i++) {leftStack.push(rightStack.pop());}}public int size() {return leftStack.size() + rightStack.size();}public static void main(String[] args) {Buffer buffer = new Buffer();String str = "123456789";for (int i = 0; i < str.length(); i++) {buffer.insert(str.charAt(i));}buffer.left(2);System.out.print("leftStack: ");for (Character c : buffer.leftStack)System.out.print(c + " ");System.out.println();System.out.print("rightStack: ");for (Character c : buffer.rightStack)System.out.print(c + " ");System.out.println();buffer.delete();System.out.print("leftStack: ");for (Character c : buffer.leftStack)System.out.print(c + " ");System.out.println();System.out.print("rightStack: ");for (Character c : buffer.rightStack)System.out.print(c + " ");System.out.println();buffer.right(4);System.out.print("leftStack: ");for (Character c : buffer.leftStack)System.out.print(c + " ");System.out.println();System.out.print("rightStack: ");for (Character c : buffer.rightStack)System.out.print(c + " ");System.out.println();buffer.insert('2');System.out.print("leftStack: ");for (Character c : buffer.leftStack)System.out.print(c + " ");System.out.println();System.out.print("rightStack: ");for (Character c : buffer.rightStack)System.out.print(c + " ");System.out.println();}
}

1.3.45

答案请戳:练习1.3.45

1.3.46

import java.util.Scanner;public class Solution {public static void main(String[] args) {Scanner in = new Scanner(System.in);int N = in.nextInt();int[] nums = new int[N];for (int i = 0; i < N; i++) {nums[i] = in.nextInt();}if (isGenerate(nums))System.out.println("Can generate!");elseSystem.out.println("Can't generate!");}public static boolean isGenerate(int[] nums) {for (int i = 0; i < nums.length - 2; i++) {if (isForbiddenTriple(nums[i], nums[i + 1], nums[i + 2]))return false;}return true;}public static boolean isForbiddenTriple(int first, int second, int third) {if (first > second && first > third) {if (second < third)return true;}return false;}
}

1.3.47

答案请戳:练习1.3.47

1.3.48

public class MyStack<T> {private int size;private Node first;private class Node {T item;Node next;}private Deque<T> deque;public MyStack() {size = 0;first = null;}public void push(T item) {if (deque == null)deque = new Deque<T>();deque.pushRight(item);}public T pop() {return deque.popRight();}public boolean isEmpty() {return deque.isEmpty();}public int size() {return deque.size();}
}

1.3.49

可以看看stackoverflow上的讨论:How to implement a queue with three stacks?

1.3.50

import java.util.Iterator;public class Stack<T> implements Iterable<T> {private Node first;     // top of stack (most recently added node)private int size;          // number of itemsprivate int count;      // push pop countprivate class Node {T item;Node next;}public Stack() {first = null;size = 0;count = 0;}public Stack(Stack<T> s) {Stack<T> temp = new Stack<>();while (!s.isEmpty()) {temp.push(s.pop());}while (!temp.isEmpty()) {T item = temp.pop();push(item);s.push(item);}size = 0;count = 0;}public boolean isEmpty() {return first == null;}public int size() {return size;}public void push(T item) {Node oldFirst = first;first = new Node();first.item = item;first.next = oldFirst;size++;count++;}public T pop() {T item = first.item;first = first.next;size--;count++;return item;}@Overridepublic Iterator<T> iterator() {return new ListIterator();}private class ListIterator implements Iterator<T> {private Node current;private int originalCount;public ListIterator() {current = first;originalCount = count;}@Overridepublic boolean hasNext() {return current != null;}@Overridepublic T next() {if (originalCount != count)throw new java.util.ConcurrentModificationException();T item = current.item;current = current.next;return item;}}
}

http://chatgpt.dhexx.cn/article/VwG4TMoH.shtml

相关文章

授人以渔:分享我的算法学习经验

前言 看到知乎上有很多人提问“怎么学习算法”&#xff1f;对于这个问题&#xff0c;我想我是非常有资格回答的&#xff0c;因为我不是计算机科班出身&#xff0c;工作几年后通过自学&#xff0c;不仅转行做了推荐算法&#xff0c;而且我的算法水平无论是在公司内部还是在网络上…

算法学习计划

学习计划 根据王红梅编著的《算法设计与分析》&#xff0c;读取每一章的内容&#xff0c;然后从乐扣上找对应的算法题&#xff0c;包含简单-中等-困难三种程度。尽量每两周能够完成一章。遇到一种类型的问题时&#xff0c;先自己想想解决方案&#xff0c;然后再看标准答案。 …

机器学习之算法

机器学习之算法 一、k-近邻算法&#xff08;knn算法&#xff09;1.算法原理2.算法参数3.示例&#xff1a;使用k-近邻算法进行分类4.示例&#xff1a;使用k-近邻算法进行回归拟合5.实例&#xff1a;糖尿病预测 二、线性回归算法1.单变量线性回归算法成本函数梯度下降算法模型优化…

算法学习路线

算法学习是一条漫长而又苦涩的道路。之所以漫长&#xff0c;是因为有关算法的学习是无穷无尽的&#xff0c;如果你不想经历程序员的35岁之劫难&#xff0c;那就要不断地学习算法&#xff0c;提高自己的不可替代性。之所以是苦涩&#xff0c;是因为算法更像是数学题&#xff0c;…

算法入门学习

算法 1. 算法1.1 什么是算法&#xff1f;1.2 算法的质量评价指标1.2.1 时间复杂度1.2.1.1 常见的时间复杂度量级&#xff08;效率从高到低&#xff09;1.2.1.1.1 常数阶O(1)1.2.1.1.2 对数阶O(log n)1.2.1.1.3 线性阶O(n)1.2.1.1.4 线性对数阶O(n * log n)1.2.1.1.5 平方阶O(n^…

算法学习的一些个人心得

目录 前言正文总结 前言 悟已往之不谏&#xff0c;知来者之可追。 正文 常规的经验贴呢&#xff0c;就是给学弟学妹推荐一些书单&#xff0c;然后写一写自己的刷题经历&#xff0c;最后推荐大家多打比赛&#xff0c;多做项目&#xff0c;多买一些网课。这是比较容易写的。 但…

算法学习指南:什么是算法?

解释算法的实现逻辑就像讲故事一样。算法会在普通的解决方案中引入新颖的思路或进行某种创新。在本文中&#xff0c;我们将讨论一个简单问题的几个解决方案&#xff0c;解释影响算法性能的一些因素。在这个过程中&#xff0c;我将介绍一些用于分析算法性能的技巧。这些技巧与算…

算法学习基础(一)

作为一名普通的二本学校&#xff0c;我在很早之前就有一个目标&#xff0c;那就是大学之后好好找一个软件开发工作。因此学习了很多的编程基础&#xff0c;不过近几天面试发现&#xff0c;技术官总是喜欢问你算法知识。编程语言不断变化&#xff0c;但是很底层的知识与算法密切…

算法学习(一)

算法第四版学习笔记–1.3 Bags, Queues and Stacks 前面120页都是Java基础&#xff0c;建议有Java基础的同学可以直接从120页开始学习&#xff0c;但是这里面的例子有用到algs4这个jar&#xff0c;需要稍微了解一下&#xff0c;影响不大&#xff0c;都是对JDK的一些封装。 In…

算法学习入门

14天阅读挑战赛 *努力是为了不平庸~ 算法学习有些时候是枯燥的&#xff0c;这一次&#xff0c;让我们先人一步&#xff0c;趣学算法&#xff01;欢迎记录下你的那些努力时刻&#xff08;算法学习知识点/算法题解/遇到的算法bug/等等&#xff09;&#xff0c;在分享的同时加深对…

什么是算法?如何学习算法?算法入门的学习路径

何为算法 简单的说,算法就是:解决问题的手段,并且是批量化解决问题的手段。 比如,我们想要从成都去北京,起点就是成都,终点就是北京。如何去?我们就可以称为算法。 因此选择不同的算法,那么虽然终点都是一样,但是性能以及效率就根据算法的优劣而决定的。因此,我们…

如何学习算法?

今天在群里刚好看到有人在讨论算法的问题&#xff0c;刚好自己曾经也有一个算法大神的梦&#xff0c;来说说自己对算法的理解。 算法怎么学&#xff1f;什么样程度才算把算法学透&#xff1f;算法学会了有什么用&#xff1f; 算法的学习是非常重要的&#xff0c;那算法学到什么…

突发!大连理工大学研三学生自杀,遗书曝光,研究生的压力应该谁来化解?...

点击上方“码农突围”&#xff0c;马上关注 这里是码农充电第一站&#xff0c;回复“666”&#xff0c;获取一份专属大礼包真爱&#xff0c;请设置“星标”或点个“在看” 来源&#xff1a;科研干货 10月13日&#xff0c;微博上一个名为“红烧土豆叶”的网友引起广大网友关注&a…

英雄算法学习路线

文章目录 零、自我介绍一、关于拜师二、关于编程语言三、算法学习路线1、算法集训1&#xff09;九日集训2&#xff09;每月算法集训 2、算法专栏3、算法总包 四、英雄算法联盟1、英雄算法联盟是什么&#xff1f;2、如何加入英雄算法联盟&#xff1f;3、为何会有英雄算法联盟&am…

算法如何学习?别想太多,两个字

文章目录 前言一、语言基础1、「 光天化日学C语言 」 二、刷题必读1、「 LeetCode零基础指南 」2、「 九日集训每日打卡 」 三、语言入门1、「 C语言入门100例 」 四、算法入门1、「 算法零基础100讲 」 五、算法进阶1、「 画解数据结构 」2、「 LeetCode算法题集汇总 」3、「 …

YOLOv5剪枝✂️| 模型剪枝实战篇

本篇博文所用代码为开源项目修改得到,且不适合基础太差的同学。 本篇文章主要讲解代码的使用方式,手把手带你实现YOLOv5模型剪枝操作。 文章目录 0. 环境准备1. 使用YOLOv5训练自己的模型2. 对训练好的模型进行稀疏训练3. 对稀疏训练后的模型进行剪枝4. 对剪枝后的网络模型微…

决策树——预剪枝和后剪枝

目录 简析 为什么要剪枝&#xff1f; 剪枝的基本策略 预剪枝 后剪枝 剪枝的优缺点 预剪枝的优缺点 后剪枝的优缺点 实现 数据集 剪枝前 预剪枝 分析 代码 简析 为什么要剪枝&#xff1f; “剪枝”是决策树学习算法对付 “过拟合” 的主要手段 可通过“剪枝”来…

网络剪枝通俗解释

论文链接&#xff1a;Learning Efficient Convolutional Networks through Network Slimming 视频链接&#xff1a;唐宇迪 基本思想 我们在模型生成通道数为[64,128,256,512]的特征图&#xff0c;但是这些特征图不一定都重要&#xff0c;我们希望能够体现特征图的主次之分&…

α、β剪枝法

在讲α、β剪枝法之前&#xff0c;我们先了解一下极大极小值算法&#xff1b;因为α、β剪枝法是为了简化极大极小值的计算而提出的。 极大极小值法 Minimax算法 又名极小化极大算法&#xff0c;是一种找出失败的最大可能性中的最小值的算法&#xff08;即最小化对手的最大得益…

决策树的剪枝

目录 一、为什么要剪枝 二、剪枝的策略 1、预剪枝&#xff08;pre-pruning&#xff09; 2、后剪枝&#xff08;post-pruning&#xff09; 三、代码实现 1、收集、准备数据&#xff1a; 2、分析数据&#xff1a; 3、预剪枝及测试&#xff1a; 4、后剪枝及测试&#xff1…