本次實驗分爲鏈表練習和數組練習兩部分,是對咱們從開學到如今學過的數據結構的一個練習及應用。雖然藍墨雲上分了五個節點,但其實是用鏈表和數組的方式分別進行如下三個節點的步驟。php
實驗一的要求是完成上述節點一所提到的內容。html
LinkedQueue類
來實現,主要使用了LinkedQueue類
的構造方法、enqueue方法
、size()方法
和toString()方法
。StringTokenizer類
,另外一種使用了String
類的split方法
。StringTokenizer tokenizer = new StringTokenizer(str); while (tokenizer.hasMoreTokens()){ String transfer = tokenizer.nextToken(); for (int i = 0;i < transfer.length();i++){ queue.enqueue(transfer.charAt(i)); } }
charAt()
方法,因此致使了輸出以後是一個數字一個節點的問題。StringTokenizer tokenizer = new StringTokenizer(str); while (tokenizer.hasMoreTokens()){ String transfer = tokenizer.nextToken(); for (int i = 1;i < transfer.length();i++){ queue.enqueue(transfer); } }
String[] transfer = str.split(" "); for (int i = 0; i < transfer.length;i++){ queue.enqueue(transfer[i]); }
實驗二的要求是完成上述節點二所提到的內容。java
//讀取文件 BufferedInputStream in = new BufferedInputStream(new FileInputStream("E:\\java\\point2.txt")); //一次性取多少字節 byte[] bytes = new byte[2048]; //接受讀取的內容(n就表明的相關數據,只不過是數字的形式) int n = -1; String a = null; //循環取出數據 while ((n = in.read(bytes,0,bytes.length)) != -1) { //轉換成字符串 a = new String(bytes,0,n,"GBK"); }
LinkedQueue類
,在其中加入三個方法便可。public void addFirst(T element){ LinearNode<T> node = new LinearNode<T>((T) element); if (head == null) { head = node; tail = node; } else { node.setNext(head); head = node; } count++; }
public void addMiddle(int index,T element){ LinearNode<T> node = new LinearNode<>(element); LinearNode<T> current = head; int j = 0; while (current != null && j < index - 2){//使指針指向index-1的位置 current = current.getNext(); j ++; } node.setNext(current.getNext()); current.setNext(node); count++; }
public void Delete(int index){ LinearNode<T> current = head; LinearNode<T> temp = head; if (index == 0){ head = head.getNext(); } else { for (int i = 0;i < index - 1;i++){ temp = current; current = current.getNext(); } temp.setNext(current.getNext()); } count--; }
實驗三的要求是完成上述節點三所提到的內容。node
public void Sort(){ LinearNode<T> node = head,current = null; if (head == null || head.getNext() == null){ return; } while (node.getNext() != current){ while (node.getNext() != current){ if (Integer.parseInt(String.valueOf(node.getElement())) > (Integer.parseInt(String.valueOf(node.getNext().getElement())))){ T temp = node.getElement(); node.setElement(node.getNext().getElement()); node.getNext().setElement(temp); } node = node.getNext(); } current = node; node = head; LinearNode<T> temp = head; String str = ""; int i = 0; while (temp != null){ str += temp.getElement() + " "; temp = temp.getNext(); i++; } System.out.println(str); System.out.println("元素總數爲: " + count); } return; }
實驗四的要求是完成上述節點一和節點二所提到的內容。git
ArrayQueue類
來完成接下來的實驗,由於時間關係我只寫了實驗中要使用的方法,而一些Queue常規的方法好比dequeue並無實現。LinkedQueue類
的構造方法、enqueue方法
、size()方法
和toString()方法
,在編寫這些方法中一些其餘必要的方法好比isEmpty()、expandCapacity()等也都進行了實現。ArrayQueue類
中的方法不少,此處就再也不一一列出,放出碼雲連接。public void insert(int index,int element){ if (index != 0){ int i; for (i = count + 1; i >= index - 1; i--){ queue[i] = queue[i - 1]; } queue[i + 1] = element; } else { for (int i = count + 1;i > 0;i--){ queue[i] = queue[i - 1]; } queue[0] = element; } count++; }
public void delete(int index){ for (int i = index;i < count;i++){ queue[i] = queue[i + 1]; } count--; }
public void Sort(){ for (int i = 0;i < count;i++){ int k = i; //找出最小值 for (int j = i + 1;j < count;j++){ if (queue[k] > queue[j]){ k = j; } } //進行排序 if (k > i){ int temp = queue[i]; queue[i] = queue[k]; queue[k] = temp; } int b = i + 1; System.out.println("第" + b + "次排序後的數組爲: "); for (int a = 0;a < count;a++){ String str = ""; str += queue[a] + " "; System.out.print(str); } System.out.println(); System.out.println("元素總數爲: " + count); } }
split
和StringTokenizer
都能實現截取字符串的功能,那麼在實際狀況中應該如何選擇呢?StringTokenizer
要比split
性能好.subString
、split
和StringTokenizer
三者進行比較的,可能由於不一樣的人測試的方法不一樣,有時候subString
比split
效率高可是有時候split
又更勝一籌,可是StringTokenizer
確定都是耗費時間最短的。不過當要截取的字符串不是很長時三者能夠隨意使用,由於大多數人在實驗時使用的單位都是納秒,其實差異不是很大。我找到一篇我認爲講解最詳細的一篇博客:StringTokenizer、split、substring對比。temp
的值會隨着node
的值的變化而變化。因而我修改了代碼,再也不設置一個節點而是設置一個泛型T來儲存本來node
的值。