本次实验分为链表练习和数组练习两部分,是对咱们从开学到如今学过的数据结构的一个练习及应用。虽然蓝墨云上分了五个节点,但其实是用链表和数组的方式分别进行如下三个节点的步骤。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
的值。