【Java】 大話數據結構(1) 線性表之順序存儲結構

?

?本文根據《大話數據結構》一書,實現了Java版的順序存儲結構

順序存儲結構指的是用一段地址連續的存儲單元一次存儲線性表的數據元素,一般用一維數組來實現。

書中的線性表抽象數據類型定義如下(第45頁):

實現程序:

package SqList;/*** * 幾個注意點:* 1.初始化時,應考慮數組大小為負的情況* 2.在各操作中,當涉及到位置i時,都應考慮i位置不合理的情況* 3.插入操作中,需考慮線性表已滿的情況*   刪除、獲取操作中,需考慮線性表為空的情況* 4.插入刪除操作中,均應考慮插入或刪除位置為表尾情況(似乎沒必要)* 5.插入刪除操作中,別忘了最后要改變表長* * 幾點困惑:* 1.插入刪除位置為表尾時,沒有判斷語句,循環部分也不會執行,判斷是否在表尾會不會顯得畫蛇添足?*   (《大話》一書中進行了該判斷)* 2.RuntimeException類型在邏輯異常時使用,因為異常暫時還沒學很好,用法是否正確?* 3.查找元素時,是否使用equals()方法比較合適?* * 拓展* 1.可進一步添加add方法,直接在表尾添加新的元素* 2.可添加整表打印輸出的方法* @author Yongh** @param <E>*/
public class SqList<E> {private Object[] data; //存儲數據元素private int length; //線性表當前長度private int maxSize;//數組長度,即最大儲存空間/** * 若初始化時未聲明大小,則默認設置為20 */ public SqList(){//data=new Object[20];//length=0;/*直接利用this()更方便*/this(20);}/** * 初始化線性表 */ public SqList(int initialSize){if(initialSize<0) {throw new RuntimeException("數組大小為負,初始化失敗!");				}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個位置的元素值*/public E GetElem(int i) {if(this.length==0) {throw new RuntimeException("空表,無法獲取數據!");			}if(i<1||i>this.length) {throw new RuntimeException("數據位置錯誤!");}System.out.println("數據獲取成功!");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個位置插入新元素*/public boolean ListInsert(int i,E e) {if(i<1||i>this.length+1) {throw new RuntimeException("插入位置錯誤:"+i);}if(this.length==this.maxSize) {/*1.無法繼續插入*///System.out.println("表已滿,無法繼續插入!");//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) {  //插入數據不在表尾       **這個判斷是否有必要呢?for(int j=this.length+1;j>i;j--) this.data[j-1]=this.data[j-2];		    }this.data[i-1]=e;	this.length++;  //表長改變勿忘System.out.println("插入成功!");return true;}/*** 刪除第i個位置的元素,并用e返回其值*/public E ListDelete(int i) {if(this.length==0) {throw new RuntimeException("空表,無法執行刪除操作!");}			if(i<1||i>this.length) {throw new RuntimeException("刪除位置錯誤!");}E e=(E) this.data[i-1]; if(i<this.length) {   //刪除數據不在表尾       **這個判斷是否有必要呢?for(int j=i;j<this.length;j++) {this.data[j-1]=this.data[j];}}this.length--;System.out.println("刪除成功!");return e;}/*** 返回線性表的元素個數*/public int ListLength() {return this.length;}	
}

  

測試代碼:

  基本數據類型和引用類型各寫了一個測試代碼。

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("——————————插入幾個位置錯誤的情況——————————");//nums.ListInsert(6, 6);//nums.ListInsert(3, 3);//nums.ListInsert(0, 0);System.out.println("——————————插入1到5,并讀取內容——————————");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+"個位置的值為:"+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("——————————刪除2、5——————————");num=nums.ListDelete(2);System.out.println("已刪除:"+num);num=nums.ListDelete(4);System.out.println("已刪除:"+num);System.out.println("當前表長:"+nums.ListLength());for(int i=1;i<=nums.ListLength();i++) {num=nums.GetElem(i);System.out.println("第"+i+"個位置的值為:"+num);}nums.ClearList();nums.IsEmpty();		}
}

  

初始化成功!
表為空
——————————插入1到5,并讀取內容——————————
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
表不為空
數據獲取成功!
第1個位置的值為:1
數據獲取成功!
第2個位置的值為:2
數據獲取成功!
第3個位置的值為:3
數據獲取成功!
第4個位置的值為:4
數據獲取成功!
第5個位置的值為:5
——————————查找0、5、8是否在表中——————————
0的位置:查找失敗!
0
1的位置:查找成功!
1
5的位置:查找成功!
5
——————————刪除2、5——————————
刪除成功!
已刪除:2
刪除成功!
已刪除:5
當前表長:3
數據獲取成功!
第1個位置的值為:1
數據獲取成功!
第2個位置的值為:3
數據獲取成功!
第3個位置的值為:4
線性表已清空!
表為空
SqListTest輸出結果

?

package SqList;public class SqListTest2 {public static void main(String[] args) {SqList<Student> students =new SqList<Student>();students .IsEmpty();System.out.println("——————————插入1到5,并讀取內容——————————");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+"個位置為:"+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("——————————刪除小E、小B——————————");stu=students .ListDelete(2);System.out.println("已刪除:"+stu.name);stu=students .ListDelete(4);System.out.println("已刪除:"+stu.name);System.out.println("當前表長:"+students .ListLength());for(int i=1;i<=students .ListLength();i++) {stu=students .GetElem(i);System.out.println("第"+i+"個位置為:"+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,并讀取內容——————————
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
表不為空
數據獲取成功!
第1個位置為:小A
數據獲取成功!
第2個位置為:小B
數據獲取成功!
第3個位置為:小C
數據獲取成功!
第4個位置為:小D
數據獲取成功!
第5個位置為:小E
——————————查找小A、小E、小龍是否在表中——————————
小A的位置:查找成功!
1
小E的位置:查找成功!
5
小龍的位置:查找失敗!
0
——————————刪除小E、小B——————————
刪除成功!
已刪除:小B
刪除成功!
已刪除:小E
當前表長:3
數據獲取成功!
第1個位置為:小A
數據獲取成功!
第2個位置為:小C
數據獲取成功!
第3個位置為:小D
線性表已清空!
表為空
SqListTest2輸出結果

?

?

轉載于:https://www.cnblogs.com/yongh/p/9115683.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452458.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序復雜程度的定量度量

對程序復雜程度進行度量的目的 1.把程序的復雜程度乘以適當常數即可估算出軟件中錯誤的數量以及軟件開發需要用的工作量&#xff0c; 2.定量度量的結果可以用來比較兩個不同的設計或兩個不同算法的優劣&#xff1b; 3.程序的定量的復雜程度可以作為模塊規模的精確限度。 …

Readhat中升級openssh

1.掛載yum源&#xff08;鏡像&#xff09; 如何掛載yum源&#xff08;鏡像&#xff09;&#xff0c;在本人的另外一篇博客中&#xff0c;請戳這里 2.安裝升級所需依賴 由于升級ssh需要安裝依賴&#xff0c;這里提前將所需依賴安裝 指令&#xff1a; yum install -y zlib-dev…

android暫停活動,如何將Android暫停活動帶到前面

我有一個活動啟動異步任務,偵聽來自服務器的消息.當用戶點擊主頁按鈕時,活動暫停,異步任務繼續在后臺運行.當某個消息到達時,我希望活動恢復并在不重新創建的情況下到達前面.我嘗試了以下內容.機器人:launchMode "singleTop"intent new Intent(getBaseContext(), M…

軟件開發人員怎樣走好從技術到管理之路?

軟件開發人員怎樣走好從技術到管理之路&#xff1f;這是一部分技術人員思考和談論的老話題。雖然我自己并沒有豐富的管理經驗&#xff0c;但還是想記載下這一段時間里對這一問題的想法。從我個人走過的路來看&#xff0c;要走順這條路&#xff0c;應該做好三個方面&#xff1a;…

如何選擇程序設計語言

程序設計語言是人和計算機通信的最基本的工具&#xff0c;會影響人的思維和解題方式&#xff0c;影響人和計算機通信的方式和質量&#xff0c;影響其他人閱讀和理解程序的難易程度。 選擇適宜的程序設計語言的原因&#xff1a; 1.根據設計去完成編碼時&#xff0c;困難最少&am…

zabbix4

1.宏(Macros) 宏可以理解為一個用于文本替換模式的預設文本內容&#xff1b; 宏根據一系列預定義的規則替換一定格式的文本模式&#xff0c;一般情況下&#xff0c;解釋器或編譯器在遇到宏時會自動進行文本模式替換&#xff1b; 類似的&#xff0c;Zabbix可以基于宏保存預設文件…

結對項目——Subway

博客鏈接&#xff1a;結對項目-Subway 轉載于:https://www.cnblogs.com/Dominic-Abraham/p/9117266.html

Readhat中作安全基線

文章目錄1.新建文件夾并上傳腳本2.修改腳本中設置root2用戶的密碼字段3.添加腳本的可執行權限4.執行腳本5.嘗試使用root2登錄驗證1.新建文件夾并上傳腳本 在根目錄下的/openssh8&#xff08;沒有則新建&#xff09;中上傳腳本&#xff1a; 2.修改腳本中設置root2用戶的密碼字…

軟件測試的準則

1.所有測試都應該能追溯到用戶需求&#xff1b;2.應該遠在測試開始之前就制定出測試計劃&#xff1b;3.把Pareto原理應用到軟件測試中&#xff1b;4.應該從“小規模”測試開始&#xff0c;并逐步進行“大規模”測試&#xff1b;5.窮舉測試是不可能的&#xff1b;6.為了達到最佳…

在線計算機計器,計算機存儲單位換算-電腦容量在線換算器

APP說明存儲單位是一種計量單位。指在某一領域以一個特定量&#xff0c;或標準做為一個記錄(計數)點。再以此點的某個倍數再去定義另一個點&#xff0c;而這個點的代名詞就是計數單位或存儲單位。二進制序列用以表示計算機、電子信息數據容量的量綱&#xff0c;基本單位為字節B…

WordPress插件開發-創建、停用、刪除插件

插件存放目錄 wp-content/plugins 創建一個插件 在plugins創建一個文件插件文件夾&#xff0c;命名最好加前綴&#xff0c;這個前綴可以使用你的名字或者你自己的域名&#xff0c;防止插件和別人重名&#xff0c;再創建一個PHP文件名字和你的插件名一樣。我這里創建一個名為 yg…

在eclipse中使用hadoop插件

我的配置環境看我的上篇博文。 配置過程&#xff1a; &#xff08;1&#xff09;把插件放到eclipse/plugins目錄下。&#xff08;我的版本上一篇也有&#xff09; &#xff08;3&#xff09;重啟eclipse&#xff0c;配置Hadoop installation directory 如果插件安裝成功&#…

從程序員到技術領導者

入行 你為什么要當程序員&#xff1f;每當我問起很多人入行的人&#xff0c;回答各不相同。 有很多人是因為喜歡。誰說過&#xff1a;熱愛是最好的老師。當然&#xff0c;關鍵是熱愛是否能支撐自己把愛好做成一份職業。但不論做多久&#xff0c;因為熱愛或曾經熱愛&#xff0…

黑盒測試和白盒測試

黑盒測試&#xff08;又稱功能測試&#xff09;把程序看作一個黑盒子&#xff0c;完全不考慮程序的內部結構和處理過程。黑盒測試是在程序接口進行的測試&#xff0c;只檢查程序功能是否能按照規格說明書的規定正常使用&#xff0c;程序是否能適當地接收輸入數據并產生正確的輸…

Diango博客--11.Nginx + Gunicorn + Supervisor 方式部署

文章目錄0.部署前準備1.創建一個超級用戶2.更新 SQLite33.安裝 Python3 、pip3.6以及 Pipenv4.部署代碼5.使用 Gunicorn6.啟動 Nginx 服務器7.配置 Nginx8.關閉 DEBUG 模式&#xff0c;收集靜態文件9.使用 Supervisor管理 Gunicorn 進程10.使用 CDN 加快 Bootstrap 和 jQuery 的…

計算機更改了用戶名數據恢復,怎么把電腦更換用戶后恢復到原來的用戶呢?

如何讓administrator帳戶出現在登陸畫面&#xff1f;安裝Windows XP時&#xff0c;如果設置了一個管理員賬戶&#xff0c;那么系統內置沒有密碼保護的Administrator管理員賬戶是不會出現在用戶登錄列表中的。雖然它身在幕后&#xff0c;可卻擁有系統最高權限&#xff0c;為了方…

StringBuilder類

1.1 StringBuilder類概述StringBuilder:是一個可變的字符串。字符串緩沖區類。 String和StringBuilder的區別&#xff1a;String的內容是固定的StringBuilder的內容是可變的1.1.1 拼接字符串耗費內存原因:每次拼接都會產生新的字符串對象,而利用StringBuilder來拼接字符串自始至…

如何使用搜索技巧來成為一名高效的程序員

沒有人是完全獨立的孤島&#xff0c;每個人都是整體的一部分。—— 約翰多恩對于缺乏編程知識的人來說&#xff0c;完全有可能編寫一個網頁或小程序。如果在用Google搜索相關示例時幸運的話&#xff0c;可以搜到現成的代碼。即使是經驗豐富的程序員&#xff0c;通常也會為了節省…

電開大計算機應用基礎作業,2016年電大-電大計算機應用基礎作業 答案.doc

2016年電大-電大計算機應用基礎作業 答案計算機作業2單項選擇題&#xff1a;第1題:在Word中編輯文本時&#xff0c;編輯區顯示的“水印”在打印時( )出現在紙上。(2分)A、不會B、全部C、一部分D、大部分第2題:Word文檔以文件形式存放于磁盤中&#xff0c;其默認的文件擴展名為(…

軟件測試的步驟

大型軟件系統的測試過程基本上由模塊測試、子系統測試、系統測試、驗收測試和平行運行等五個步驟組成。 1.模塊測試 在設計得好的軟件系統中&#xff0c;每個模塊完成一個清晰定義的子功能&#xff0c;而且這個子功能和同級其他模塊的功能之間沒有相互依賴關系。因此&#xff…