基础的数组/链表实现的队列
生活随笔
收集整理的這篇文章主要介紹了
基础的数组/链表实现的队列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上周我們學習了隊列的實現,我們可以通過數組或者鏈表實現隊列,隊列是對數據的一種存儲方式,但是它更優于數組和鏈表,下面是編寫的簡單的數組/鏈表對隊列的實現,完善版的還沒有完全搞好,先是最基礎的實現類:
?
數組實現的隊列:
package lyw.study0411;/*** 通過數組來實現隊列* 作用 :用來實現一個隊列類用來存儲對象* @author 劉俞雯 2013-04-11*/ public class MyQueue {//定義一個數組內用來存儲數據的數組,初始長度為0private MyStudent[] srcA=new MyStudent[0];/*** 用來給數組中添加MyStudent對象* @param ms MyStudent類的對象名*/public void add(MyStudent ms){//1.新建一個學生類的數組,長度是原數組長度+1MyStudent[] srcB=new MyStudent[srcA.length+1];//2.將要加入的對象ms放入新數組的最后一位srcB[srcA.length]=ms;//3.把原數組放入新數組for(int i=0;i<srcA.length;i++){srcB[i]=srcA[i];System.out.println("此時加入了:"+srcB[i]);}//4.指向新建的數組srcA=srcB;}/*** 用來取得隊列中index位置的對象* @param index 要取得對象的位置* @return 一個學生對象*/public MyStudent get(int index){MyStudent ms=srcA[index];return ms;}/*** 得到隊列的長度* @return 隊列中元素個數*/public int size(){return srcA.length;}public void PrintArray(){for(int index=0;index<srcA.length;index++)System.out.println("隊列的第"+(index+1)+"個位置的數據是"+srcA[index]);}}?
?
這是簡單的數組對隊列的實現,后面還有編寫的簡單測試類:
package lyw.study0411;public class MyStudent {//定義學生的性命年齡屬性private String name; private int age; static MyStudent a1; static MyStudent a2; static MyStudent a3;/*** 入口主函數* @param args*/public static void main(String[] args) {//實例化一個隊列對象MyQueue mq=new MyQueue();//調用它的各種方法mq.add(a1);mq.add(a2);mq.add(a3);mq.get(2);System.out.println("2號位置的學生:"+mq.get(2));mq.size();System.out.println("隊列的長度:"+mq.size());mq.PrintArray();}//編寫構造方法傳入屬性public MyStudent(String name,int age){this.name=name;this.age=age;}public MyStudent(){} }?剛開始編寫的時候在隊列里傳入的是學生類,所以只好只能加入學生類的對象,但是上面的代碼中加入的學生對象a1等都是空值,以后會通過設置Object類來添加各種不同類型的對象,目前程序正在完善。
?
通過鏈表實現的隊列:
package lyw.study0416;/*** 通過鏈表實現一個隊列類* 作用 實現一個隊列類,用來存儲對象* @author 劉俞雯 2013-04-16**/ public class MyQueue2 {//根結點private static MyNode2 root;//另外的結點用來保存根結點private MyNode2 other;//計數器private int count=1;//隊列的初始長度private int size=0; /*** 向隊列中添加元素* @param mn 向隊列中添加的對象*/public void add(Object mn){//開始加入元素if(root==null){//實例化一個結點,為根結點root=new MyNode2();//把要傳入的數據加入根結點root.date=mn; // System.out.println("root="+root.date);//之后把other指向rootother=root;}else{//新實例化一個結點類對象nodeMyNode2 node=new MyNode2();//把要傳入的數據加入新結點node.date=mn;//other的下一個結點為nodeother.next=node;//other指向他的下一個結點other=other.next; // System.out.println("other="+other.date);}}/*** 從隊列中取出元素* @param index 取出元素的位置* @return 查找位置的結點*/public Object get(int index){//實例化一個新的結點對象ms為需要返回的結點MyNode2 ms=new MyNode2();//把other指向rootother=root;//遍歷鏈表查找對應位置的結點while(count<=index){System.out.println("count="+count);if(count==index){//需要返回的值為other結點ms=other;count ++;}else{count++;other=other.next;ms=other;}}return ms;}/*** 取得當前隊列的長度* @return 當前鏈表的長度*/public int size(){ //新實例化一個結點nodeMyNode2 node=new MyNode2();other=root;if(other==null){return size;}else{while(other!=null){ size++; node=other.next; other=node; } return size; } } /*** 打印鏈表中的數據* @param root 根結點的數據*/public void printLink(MyNode2 root,int index){if(root!=null){System.out.println("第"+index+++"個位置的數據是:"+root.date);MyNode2 next=root.next;printLink(next,index++);}}public static void main(String[] args) {//新建一個隊列對象MyQueue2 mq=new MyQueue2();//調用mq的各種方法mq.add(123);mq.add("劉");mq.add("劉俞雯");mq.add("哈哈");mq.add("哈");mq.add("You");mq.add(1267);MyNode2 mn1=(MyNode2) mq.get(3);System.out.println("第三位的 :"+mn1.date); int si=mq.size(); System.out.println("鏈表的長度為:"+si); int index = 1;mq.printLink(root,index);}}?
后面是定義的結點類:
package lyw.study0416;/*** 通過鏈表實現一個隊列類* 作用 實現一個隊列類,用來存儲對象* @author 劉俞雯 2013-04-16**/ public class MyQueue2 {//根結點private static MyNode2 root;//另外的結點用來保存根結點private MyNode2 other;//計數器private int count=1;//隊列的初始長度private int size=0; /*** 向隊列中添加元素* @param mn 向隊列中添加的對象*/public void add(Object mn){//開始加入元素if(root==null){//實例化一個結點,為根結點(由于剛開始的時候在root前又加了MyNode2,相當于新的一個root對象,//而不是屬性中的root,導致無法加入,最后在改進下改正了過來 )root=new MyNode2();//把要傳入的數據加入根結點root.date=mn; // System.out.println("root="+root.date);//之后把other指向rootother=root;}else{//新實例化一個結點類對象nodeMyNode2 node=new MyNode2();//把要傳入的數據加入新結點node.date=mn;//other的下一個結點為nodeother.next=node;//other指向他的下一個結點other=other.next; // System.out.println("other="+other.date);}}/*** 從隊列中取出元素* @param index 取出元素的位置* @return 查找位置的結點*/public Object get(int index){//實例化一個新的結點對象ms為需要返回的結點MyNode2 ms=new MyNode2();//把other指向rootother=root;//遍歷鏈表查找對應位置的結點while(count<=index){System.out.println("count="+count);if(count==index){//需要返回的值為other結點ms=other;/***開始在這一步沒加count++,導致當到了索引的位置之后,*因為while中的count<=index也一直成立,形成了死循環,*導致電腦卡機。。。。。。-_- !。。之后經過調試才改了過來o(∩_∩)o*/count ++;}else{count++;other=other.next;ms=other;}}return ms;}/*** 取得當前隊列的長度* @return 當前鏈表的長度*/public int size(){ //新實例化一個結點nodeMyNode2 node=new MyNode2();other=root;if(other==null){return size;}else{while(other!=null){ size++; node=other.next; other=node; } return size; } } /*** 打印鏈表中的數據* @param root 根結點的數據*/public void printLink(MyNode2 root,int index){if(root!=null){System.out.println("第"+index+++"個位置的數據是:"+root.date);MyNode2 next=root.next;printLink(next,index++);}}public static void main(String[] args) {//新建一個隊列對象MyQueue2 mq=new MyQueue2();//調用mq的各種方法mq.add(123);mq.add("劉");mq.add("劉俞雯");mq.add("哈哈");mq.add("哈");mq.add("You");mq.add(1267);MyNode2 mn1=(MyNode2) mq.get(3);System.out.println("第三位的 :"+mn1.date); int si=mq.size(); System.out.println("鏈表的長度為:"+si); int index = 1;mq.printLink(root,index);}}?
下面是程序執行后的結果:
count=1
count=2
count=3
第三位的 :劉俞雯
鏈表的長度為:7
第1個位置的數據是:123
第2個位置的數據是:劉
第3個位置的數據是:劉俞雯
第4個位置的數據是:哈哈
第5個位置的數據是:哈
第6個位置的數據是:You
第7個位置的數據是:1267
?對于數組或者鏈表實現的隊列,剛開始做的時候還有好多細節方面的錯誤,導致剛開始測試的時候的初的結果不是運行不起來要么就是運行結果不正確,之后通過一步步的測試,發現并且改正下,得到了最終的程序,而這只是最簡單的初始隊列的實現,之后還會做出有插入刪除等的隊列,還有用雙向鏈表實現的隊列。
?
總結
以上是生活随笔為你收集整理的基础的数组/链表实现的队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 佳文分享:CAP定理
- 下一篇: 【笔记】win10上,IDEA完全删除,