【Java】 大话数据结构(1) 线性表之顺序存储结构
生活随笔
收集整理的這篇文章主要介紹了
【Java】 大话数据结构(1) 线性表之顺序存储结构
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
?本文根據(jù)《大話(huà)數(shù)據(jù)結(jié)構(gòu)》一書(shū),實(shí)現(xiàn)了Java版的順序存儲(chǔ)結(jié)構(gòu)。
順序存儲(chǔ)結(jié)構(gòu)指的是用一段地址連續(xù)的存儲(chǔ)單元一次存儲(chǔ)線性表的數(shù)據(jù)元素,一般用一維數(shù)組來(lái)實(shí)現(xiàn)。
書(shū)中的線性表抽象數(shù)據(jù)類(lèi)型定義如下(第45頁(yè)):
實(shí)現(xiàn)程序:
package SqList;/*** * 幾個(gè)注意點(diǎn):* 1.初始化時(shí),應(yīng)考慮數(shù)組大小為負(fù)的情況* 2.在各操作中,當(dāng)涉及到位置i時(shí),都應(yīng)考慮i位置不合理的情況* 3.插入操作中,需考慮線性表已滿(mǎn)的情況* 刪除、獲取操作中,需考慮線性表為空的情況* 4.插入刪除操作中,均應(yīng)考慮插入或刪除位置為表尾情況(似乎沒(méi)必要)* 5.插入刪除操作中,別忘了最后要改變表長(zhǎng)* * 幾點(diǎn)困惑:* 1.插入刪除位置為表尾時(shí),沒(méi)有判斷語(yǔ)句,循環(huán)部分也不會(huì)執(zhí)行,判斷是否在表尾會(huì)不會(huì)顯得畫(huà)蛇添足?* (《大話(huà)》一書(shū)中進(jìn)行了該判斷)* 2.RuntimeException類(lèi)型在邏輯異常時(shí)使用,因?yàn)楫惓簳r(shí)還沒(méi)學(xué)很好,用法是否正確?* 3.查找元素時(shí),是否使用equals()方法比較合適?* * 拓展* 1.可進(jìn)一步添加add方法,直接在表尾添加新的元素* 2.可添加整表打印輸出的方法* @author Yongh** @param <E>*/ public class SqList<E> {private Object[] data; //存儲(chǔ)數(shù)據(jù)元素private int length; //線性表當(dāng)前長(zhǎng)度private int maxSize;//數(shù)組長(zhǎng)度,即最大儲(chǔ)存空間/** * 若初始化時(shí)未聲明大小,則默認(rèn)設(shè)置為20 */ public SqList(){//data=new Object[20];//length=0;/*直接利用this()更方便*/this(20);}/** * 初始化線性表 */ public SqList(int initialSize){if(initialSize<0) {throw new RuntimeException("數(shù)組大小為負(fù),初始化失敗!"); }else {this.maxSize =initialSize;this.data=new Object[initialSize];this.length=0;System.out.println("初始化成功!");}}/*** 判斷線性表是否為空*/public boolean IsEmpty(){if (this.length==0) {System.out.println("表為空");return true;}System.out.println("表不為空");return false; //return this.length==0 也可以直接這樣}/*** 清空線性表*/public void ClearList() {this.length=0;System.out.println("線性表已清空!");}/***獲取第i個(gè)位置的元素值*/public E GetElem(int i) {if(this.length==0) {throw new RuntimeException("空表,無(wú)法獲取數(shù)據(jù)!"); }if(i<1||i>this.length) {throw new RuntimeException("數(shù)據(jù)位置錯(cuò)誤!");}System.out.println("數(shù)據(jù)獲取成功!");return (E) data[i-1];}/*** 查找元素,返回值為該元素位置,0代表查找失敗*/public int LocateElem(E e) {for(int i=1;i<=this.length;i++) {if(e==data[i-1]) { System.out.println("查找成功!");return i; }}System.out.println("查找失敗!");return 0;}/*** 在第i個(gè)位置插入新元素*/public boolean ListInsert(int i,E e) {if(i<1||i>this.length+1) {throw new RuntimeException("插入位置錯(cuò)誤:"+i);}if(this.length==this.maxSize) {/*1.無(wú)法繼續(xù)插入*///System.out.println("表已滿(mǎn),無(wú)法繼續(xù)插入!");//return false;/*2.增加容量*/maxSize=maxSize+10;Object[] newdata=new Object[maxSize];for (int k=1;k<=this.length;k++)newdata[k-1]=this.data[k-1];this.data=newdata;}if (i<=this.length) { //插入數(shù)據(jù)不在表尾 **這個(gè)判斷是否有必要呢?for(int j=this.length+1;j>i;j--) this.data[j-1]=this.data[j-2]; }this.data[i-1]=e; this.length++; //表長(zhǎng)改變勿忘System.out.println("插入成功!");return true;}/*** 刪除第i個(gè)位置的元素,并用e返回其值*/public E ListDelete(int i) {if(this.length==0) {throw new RuntimeException("空表,無(wú)法執(zhí)行刪除操作!");} if(i<1||i>this.length) {throw new RuntimeException("刪除位置錯(cuò)誤!");}E e=(E) this.data[i-1]; if(i<this.length) { //刪除數(shù)據(jù)不在表尾 **這個(gè)判斷是否有必要呢?for(int j=i;j<this.length;j++) {this.data[j-1]=this.data[j];}}this.length--;System.out.println("刪除成功!");return e;}/*** 返回線性表的元素個(gè)數(shù)*/public int ListLength() {return this.length;} }
測(cè)試代碼:
基本數(shù)據(jù)類(lèi)型和引用類(lèi)型各寫(xiě)了一個(gè)測(cè)試代碼。
package SqList;public class SqListTest {public static void main(String[] args) {//SqList<Integer> nums =new SqList<Integer>(-1);SqList<Integer> nums =new SqList<Integer>(5);nums.IsEmpty();//System.out.println("——————————插入幾個(gè)位置錯(cuò)誤的情況——————————");//nums.ListInsert(6, 6);//nums.ListInsert(3, 3);//nums.ListInsert(0, 0);System.out.println("——————————插入1到5,并讀取內(nèi)容——————————");for(int i=1;i<=5;i++)nums.ListInsert(i, i);nums.IsEmpty();int num;for(int i=1;i<=5;i++) {num=nums.GetElem(i);System.out.println("第"+i+"個(gè)位置的值為:"+num);}System.out.println("——————————查找0、5、8是否在表中——————————");System.out.print("0的位置:");System.out.println(nums.LocateElem(0)); System.out.print("1的位置:");System.out.println(nums.LocateElem(1)); System.out.print("5的位置:");System.out.println(nums.LocateElem(5)); System.out.println("——————————?jiǎng)h除2、5——————————");num=nums.ListDelete(2);System.out.println("已刪除:"+num);num=nums.ListDelete(4);System.out.println("已刪除:"+num);System.out.println("當(dāng)前表長(zhǎng):"+nums.ListLength());for(int i=1;i<=nums.ListLength();i++) {num=nums.GetElem(i);System.out.println("第"+i+"個(gè)位置的值為:"+num);}nums.ClearList();nums.IsEmpty(); } }初始化成功! 表為空 ——————————插入1到5,并讀取內(nèi)容—————————— 插入成功! 插入成功! 插入成功! 插入成功! 插入成功! 表不為空 數(shù)據(jù)獲取成功! 第1個(gè)位置的值為:1 數(shù)據(jù)獲取成功! 第2個(gè)位置的值為:2 數(shù)據(jù)獲取成功! 第3個(gè)位置的值為:3 數(shù)據(jù)獲取成功! 第4個(gè)位置的值為:4 數(shù)據(jù)獲取成功! 第5個(gè)位置的值為:5 ——————————查找0、5、8是否在表中—————————— 0的位置:查找失敗! 0 1的位置:查找成功! 1 5的位置:查找成功! 5 ——————————?jiǎng)h除2、5—————————— 刪除成功! 已刪除:2 刪除成功! 已刪除:5 當(dāng)前表長(zhǎng):3 數(shù)據(jù)獲取成功! 第1個(gè)位置的值為:1 數(shù)據(jù)獲取成功! 第2個(gè)位置的值為:3 數(shù)據(jù)獲取成功! 第3個(gè)位置的值為:4 線性表已清空! 表為空 SqListTest輸出結(jié)果
?
package SqList;public class SqListTest2 {public static void main(String[] args) {SqList<Student> students =new SqList<Student>();students .IsEmpty();System.out.println("——————————插入1到5,并讀取內(nèi)容——————————");Student[] stus= {new Student("小A",11),new Student("小B",12),new Student("小C",13),new Student("小D",14),new Student("小E",151)};for(int i=1;i<=5;i++)students .ListInsert(i, stus[i-1]);students .IsEmpty();Student stu;for(int i=1;i<=5;i++) {stu=students .GetElem(i);System.out.println("第"+i+"個(gè)位置為:"+stu.name);}System.out.println("——————————查找小A、小E、小龍是否在表中——————————");System.out.print("小A的位置:");stu=stus[0];System.out.println(students .LocateElem(stu)); System.out.print("小E的位置:");stu=stus[4];System.out.println(students .LocateElem(stu)); System.out.print("小龍的位置:");stu=new Student("小龍",11);System.out.println(students .LocateElem(stu)); System.out.println("——————————?jiǎng)h除小E、小B——————————");stu=students .ListDelete(2);System.out.println("已刪除:"+stu.name);stu=students .ListDelete(4);System.out.println("已刪除:"+stu.name);System.out.println("當(dāng)前表長(zhǎng):"+students .ListLength());for(int i=1;i<=students .ListLength();i++) {stu=students .GetElem(i);System.out.println("第"+i+"個(gè)位置為:"+stu.name);}students .ClearList();students .IsEmpty(); } }class Student{public Student(String name, int age) {this.name=name;this.age=age;}String name;int age; }初始化成功! 表為空 ——————————插入1到5,并讀取內(nèi)容—————————— 插入成功! 插入成功! 插入成功! 插入成功! 插入成功! 表不為空 數(shù)據(jù)獲取成功! 第1個(gè)位置為:小A 數(shù)據(jù)獲取成功! 第2個(gè)位置為:小B 數(shù)據(jù)獲取成功! 第3個(gè)位置為:小C 數(shù)據(jù)獲取成功! 第4個(gè)位置為:小D 數(shù)據(jù)獲取成功! 第5個(gè)位置為:小E ——————————查找小A、小E、小龍是否在表中—————————— 小A的位置:查找成功! 1 小E的位置:查找成功! 5 小龍的位置:查找失敗! 0 ——————————?jiǎng)h除小E、小B—————————— 刪除成功! 已刪除:小B 刪除成功! 已刪除:小E 當(dāng)前表長(zhǎng):3 數(shù)據(jù)獲取成功! 第1個(gè)位置為:小A 數(shù)據(jù)獲取成功! 第2個(gè)位置為:小C 數(shù)據(jù)獲取成功! 第3個(gè)位置為:小D 線性表已清空! 表為空 SqListTest2輸出結(jié)果
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/yongh/p/9115683.html
總結(jié)
以上是生活随笔為你收集整理的【Java】 大话数据结构(1) 线性表之顺序存储结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CentOS 6.6 Oracle 安装
- 下一篇: Session,Cookie,jsess