算法練習(34): Queue練習(1.3.15-1.3.17)

本系列博客習題來自《算法(第四版)》,算是本人的讀書筆記,如果有人在讀這本書的,歡迎大家多多交流。為了方便討論,本人新建了一個微信群(算法交流),想要加入的,請添加我的微信號:zhujinhui207407 謝謝。另外,本人的個人博客 http://www.kyson.cn 也在不停的更新中,歡迎一起討論

算法(第4版)

知識點

  • Queue的enqueue、dequeue

題目

1.3.15 編寫一個Queue的用例,接受一個命令行參數k并打印出標準輸入中的倒數第k個字符串(假設標準輸入中至少有k個字符串)。


1.3.15 Write a Queue client that takes a command-line argument k and prints the kth from the last string found on standard input (assuming that standard input has k or more strings).

分析

本人所有簡書的算法文章詳細分析已經移入小專欄:算法四習題詳解,歡迎大家訂閱

答案

public class QueueExecise1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String a[] = 
        {
                "我的", 
                "名字", 
                "叫", 
                "頂級程序員不穿女裝",
                "微博:https://m.weibo.cn/p/1005056186766482" 
                };
        
        int k = 3;
        Queue<String> stringQueue = new Queue<String>();
        for (int i = 0; i < a.length; ++i) {
            stringQueue.enqueue(a[i]);
        }

        int index = a.length - k;
        for (int j = 0; j <= index; ++j) {
            String dequeuedString = stringQueue.dequeue();
            if (j == index)
                System.out.print(dequeuedString);
        }
    }
}

代碼索引

QueueExecise1.java

題目

1.3.16 使用1.3.1.5節中的readInts()作為模板為Date編寫一個靜態方法readDates(),從標準輸入中讀取由練習1.2.19的表格所指定的格式的多個日期并返回一個它們的數組。


1.3.16 Using readInts() on page 126 as a model,write a static method readDates() for Date that reads dates from standard input in the format specified in the table on page 119 and returns an array containing them.

分析

看英文部分寫的是,126 頁,只是中文翻譯的時候改成了1.3.1.5
下面是中文版的部分


先進先出隊列1

先進先出隊列2

對照著英文版:


英文版

為了方便沒有從前往后看的讀者理解readInts這個方法,我這里拉取了In的API,以及實現代碼如下


API for our library of static methods for standard input
構造函數

readString

參照習題1.2.19完成readDates()即可。

答案

public class Date1 {

    private int month;
    private int day;
    private int year;

    public Date1(String date) {
        String[] fields = date.split("/");
        month = Integer.parseInt(fields[0]);
        day = Integer.parseInt(fields[1]);
        year = Integer.parseInt(fields[2]);
    }

    public String toString() {
        return "" + month + "/" + day + "/" + year;
    }

    public static Date1[] readDates(String name) {
        In in = new In(name);
        Queue<Date1> q = new Queue<Date1>();
        while (!in.isEmpty()) {
            String readedString = in.readString();
            Date1 date1 = new Date1(readedString);
            q.enqueue(date1);
        }
        int N = q.size();
        Date1[] a = new Date1[N];
        for (int i = 0; i < N; i++)
            a[i] = q.dequeue();
        return a;
    }

    public static void main(String[] args) {
        String filePathString = System.getProperty("user.dir");

        String dateFileString = filePathString
                + "/src/com/kyson/chapter1/section3/" + "b.txt";
        System.out.println("即將讀取" + dateFileString + "文件中得到的數組為:");
        Date1[] date1 = readDates(dateFileString);
        System.out.println("讀取文件中得到的數組為:");
        for (int i = 0; i < date1.length; i++) {
            System.out.println(date1[i]);
        }
    }
}

代碼索引

Date1.java

題目

1.3.17 為Transaction 類完成練習1.3.16


1.3.17 DoExercise 1.3.16 for Transaction.

分析

這里不以"/"為分隔符了,用"-"做分隔符,其他部分都是一樣的。

答案

public class Transaction1 {

    private Date1 when;
    private String who;
    private double amount;

    public Transaction1(String date) {
        String[] fields = date.split("-");
        when = new Date1(fields[0]);
        who = fields[1];
        amount = Integer.parseInt(fields[2]);
    }

    public String toString() {
        return "" + this.who + " at " + this.when + " transaction "
                + this.amount;
    }

    public static Transaction1[] readTransactions(String name) {
        In in = new In(name);
        Queue<Transaction1> q = new Queue<Transaction1>();
        while (!in.isEmpty()) {
            String readedString = in.readString();
            Transaction1 transaction1 = new Transaction1(readedString);
            q.enqueue(transaction1);
        }
        int N = q.size();
        Transaction1[] a = new Transaction1[N];
        for (int i = 0; i < N; i++)
            a[i] = q.dequeue();
        return a;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String filePathString = System.getProperty("user.dir");

        String intFileString = filePathString
                + "/src/com/kyson/chapter1/section3/" + "c.txt";
        System.out.println("即將讀取" + intFileString + "文件中得到的數組為:");
        Transaction1[] transaction1s = readTransactions(intFileString);
        System.out.println("讀取文件中得到的數組為:");
        for (int i = 0; i < transaction1s.length; i++) {
            System.out.println(transaction1s[i]);
        }
    }

}

代碼分析

//獲得程序當前路徑
System.getProperty(“user.dir”)

思考

16、17的意義在于,它讓我們知道如何讀取并正確輸出信息。就是【先enqueue后dequeue】

代碼索引

Transaction1.java

視頻講解

廣告

我的首款個人開發的APP壁紙寶貝上線了,歡迎大家下載。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容