【數據結構】3順序表

0

章節

2.1到2.3小節。

理解與表達線性表的邏輯結構;

線性表的結構、結構與操作;

順序表的表示與實現;順序表應用;

重點

線性表概念、順序表定義運算與實現;

難點

無較難點;

作業或思考題

完成學習測試2,作業3.1

內容達成以下標準(考核點):

????????理解實現順序表基本操作;

????????理解與實現相關概念;完成測試,滿80分以上

作業3:順序表的基本操作

一、題目及分析

1.1題目

????????給一個隨機給定的十進?數轉換成八進制數和二進制數,并輸出它們;然后將兩個十進制數的八進制數和二進制數分別相加,輸出其和的八進制數和二進制數。

1.2分析題目完成目標與方案

????????題目要求實現將一個隨機給定的十進制數轉換成八進制和二進制,然后將兩個十進制數的八進制和二進制分別相加,并輸出其和的八進制和二進制。可以采用鏈表或順序表來進行存儲和操作。

????????對于將十進制數轉換成八進制和二進制,需要采用數學上的除法和取余運算。具體來說,連續對十進制數進行除以二或除以八的運算,每次將余數插入一個鏈表或數組中,直到商為0停止運算。最終鏈表或數組中存儲的數字就是所求。

????????對于將兩個十進制數的八進制和二進制分別相加的問題,需要先將兩個數分別轉換成對應的八進制和二進制,然后再按位相加。具體來說,可以從兩個數的最低位開始,依次將對應位置上的八進制或二進制數加起來,若和大于7或1則需要進位,最終得到的數組或鏈表就是所求的和。

????????可以定義一個節點類并在其中定義一個指向下一節點的指針,然后定義鏈表類和順序表類。鏈表類需要實現頭插入節點、打印鏈表、清空鏈表和將十進制數轉換成八進制或二進制等方法。順序表類需要實現將十進制數轉換成八進制和二進制、打印八進制和二進制、計算兩個十進制數的和以及打印兩個數的八進制和二進制等方法。

抽象成抽象數據類型(ADT):

// 鏈表節點

class ListNode {

????private int data;

????private ListNode next;

????public void setData(int data) {

????????this.data = data;

????}

????public int getData() {

????????return data;

????}

????public ListNode getNext() {

????????return next;

????}

????public void setNext(ListNode next) {

????????this.next = next;

????}

}

// 鏈表

interface LinkedListADT {

????void insert(int data); // 在鏈表頭部插入節點

????void print(); // 打印鏈表中的所有節點數據

????void convertToOctal(); // 將十進制數轉換為八進制,并將結果存儲在鏈表中

????void convertToBinary(); // 將十進制數轉換為二進制,并將結果存儲在鏈表中

????void clear(); // 清空鏈表

}

// 順序表

interface SequenceListADT {

????void convertToOctal(); // 將十進制轉換為八進制

????void convertToBinary(); // 將十進制轉換為二進制

????void printOctal(); // 打印十進制數的八進制表示

????void printBinary(); // 打印十進制數的二進制表示

????void printBinaryAndOctal(); // 打印十進制數的八進制和二進制表示

????SequenceListADT add(SequenceListADT d); // 返回兩個對象的十進制數之和的新對象

}

二、順序表實現

2.1 ?SequenceList類代碼

package homework3_2;// 順序表方法相關類
public class SequenceList {private int decimal; // 十進制數private int[] octal = new int[100]; // 八進制數組private int octalBits = 0; // 八進制位數private int[] binary = new int[100]; // 二進制數組private int binaryBits = 0; // 二進制位數public SequenceList(int d) {decimal = d;}public SequenceList() {}// 將十進制轉換為八進制private void convertToOctal() {if (octalBits == 0) { // 只在第一次需要轉換時計算int p = decimal;int q = 0;int i = 0;while (p != 0) {q = p % 8;p = p / 8;octal[i] = q;i++;octalBits++;}}}// 將十進制轉換為二進制private void convertToBinary() {if (binaryBits == 0) { // 只在第一次需要轉換時計算int p = decimal;int q = 0;int i = 0;while (p != 0) {q = p % 2;p = p / 2;binary[i] = q;i++;binaryBits++;}}}// 打印十進制數的八進制表示public void printOctal() {this.convertToOctal();System.out.print(" ??" + decimal + "的八進制數為:");for (int i = octalBits - 1; i >= 0; i--) {System.out.print(octal[i]);}System.out.println("");}// 打印十進制數的二進制表示public void printBinary() {this.convertToBinary();System.out.print(" ??" + decimal + "的二進制數為:");// 跳過前導零int startIndex = binaryBits - 1;while (startIndex >= 0 && binary[startIndex] == 0) {startIndex--;}// 輸出非前導零部分for (int i = startIndex; i >= 0; i--) {System.out.print(binary[i]);}System.out.println("");}public void printBinaryAndOctal(){this.convertToBinary();this.convertToOctal();System.out.print(" ??" + decimal + "的二進制數為:");int startIndex = binaryBits - 1;while (startIndex >= 0 && binary[startIndex] == 0) {startIndex--;}for (int i = startIndex; i >= 0; i--) {System.out.print(binary[i]);}System.out.print(" ?????????");System.out.print(" ??" + decimal + "的八進制數為:");for (int i = octalBits - 1; i >= 0; i--) {System.out.print(octal[i]);}System.out.println("");}// 返回兩個對象的十進制數之和的新對象public SequenceList add(SequenceList d) {int sumDecimal = decimal + d.decimal;return new SequenceList(sumDecimal);}
}

2.3 Main類代碼

package homework3_2;public class Main {public static void main(String[] args) {//使用順序表實現System.out.println("1.使用順序表實現");SequenceList d1 = new SequenceList(36);SequenceList d2 = new SequenceList(64);SequenceList d3 = d2.add(d1);
/* ???????d1.printOctal();d1.printBinary();d2.printOctal();d2.printBinary();d3.printOctal();d3.printBinary();System.out.println();*/d1.printBinaryAndOctal();d2.printBinaryAndOctal();d3.printBinaryAndOctal();//使用鏈表實現System.out.println("2.使用鏈表實現");LinkedList ll1 = new LinkedList(36);LinkedList ll2 = new LinkedList(64);LinkedList ll3 = new LinkedList(ll1.decimal + ll2.decimal);ll1.print();ll2.print();ll3.print();}
}

2.4程序運行結果

三、鏈表實現

3.1 ?ListNode類代碼

package homework3_2;
// 鏈表節點類
public class ListNode {int data; // 存儲節點數據ListNode next; // 指向下一個節點的指針public ListNode(int data) {this.data = data;this.next = null; // 新節點的next指針初始化為null}
}

3.2 LinkedList類代碼

package homework3_2;// 鏈表類
public class LinkedList {private ListNode head; // 頭節點,鏈表的起點int decimal; // 十進制數,待轉換的數值public LinkedList(int d) {this.decimal = d;}// 在鏈表頭部插入節點public void insert(int data) {ListNode newNode = new ListNode(data); // 創建新節點newNode.next = head; // 將新節點的next指針指向當前頭節點head = newNode; // 更新頭節點為新節點}// 打印鏈表中的所有節點數據public void print() {this.convertToBinary();System.out.print(" ??" + decimal + "的二進制數為:");ListNode current = head; // 從頭節點開始遍歷while (current != null) {System.out.print(current.data + ""); // 打印當前節點的數據current = current.next; // 移動到下一個節點}System.out.println(); // 打印換行符this.convertToOctal();System.out.print(" ??" + decimal + "的八進制數為:");current = head; // 從頭節點開始遍歷while (current != null) {System.out.print(current.data + ""); // 打印當前節點的數據current = current.next; // 移動到下一個節點}System.out.println(); // 打印換行符}// 將十進制數轉換為八進制,并將結果存儲在鏈表中public void convertToOctal() {int number = decimal; // 獲取待轉換的十進制數clear(); // 清空鏈表while (number != 0) {int remainder = number % 8; // 計算余數insert(remainder); // 在鏈表頭部插入余數number /= 8; // 更新被除數為商}}// 將十進制數轉換為二進制,并將結果存儲在鏈表中public void convertToBinary() {int number = decimal; // 獲取待轉換的十進制數clear(); // 清空鏈表while (number != 0) {int remainder = number % 2; // 計算余數insert(remainder); // 在鏈表頭部插入余數number /= 2; // 更新被除數為商}}// 清空鏈表public void clear() {head = null;}}

3.3 Main類代碼

package homework3_2;public class Main {public static void main(String[] args) {//使用順序表實現System.out.println("1.使用順序表實現");SequenceList d1 = new SequenceList(36);SequenceList d2 = new SequenceList(64);SequenceList d3 = d2.add(d1);
/* ???????d1.printOctal();d1.printBinary();d2.printOctal();d2.printBinary();d3.printOctal();d3.printBinary();System.out.println();*/d1.printBinaryAndOctal();d2.printBinaryAndOctal();d3.printBinaryAndOctal();//使用鏈表實現System.out.println("2.使用鏈表實現");LinkedList ll1 = new LinkedList(36);LinkedList ll2 = new LinkedList(64);LinkedList ll3 = new LinkedList(ll1.decimal + ll2.decimal);ll1.print();ll2.print();ll3.print();}
}

3.4程序運行結果

四、結果與總結???????

4.1順序表實現

????????順序表使用數組來存儲八進制和二進制數的每一位,通過計算余數和商來完成十進制到八進制和二進制的轉換。優點是實現簡單,轉換后的結果可以直接按照倒序輸出;缺點是需要提前設置數組的大小,不夠靈活。

4.2鏈表實現

????????鏈表使用鏈式結構來存儲八進制和二進制數的每一位,通過在頭部插入節點的方式來實現反向存儲。優點是不需要提前設置數組大小,具有較好的靈活性;缺點是在打印結果時需要遍歷鏈表。

4.3總體

4.3.1優點

①通過順序表和鏈表兩種不同的數據結構實現了相同的功能,展示了不同數據結構的靈活性。

②代碼實現簡單明了,容易理解和使用。

4.3.2缺點

①順序表的缺點是需要提前設置數組的大小,如果超過了數組大小則無法繼續進行轉換。

②鏈表的缺點是在打印結果時需要遍歷鏈表,時間復雜度較高。

4.4改進方向

①動態數組:

????????可以考慮使用動態數組來解決順序表的大小限制問題。當順序表實現中遇到需要動態擴展數組大小的情況時,可以采用動態數組的方式來解決。通過設定一個初始大小,當數組容量不足時進行動態擴展,重新分配更大的空間,并將原有數據復制到新的數組中。

②棧的實現:

????????可以引入棧的概念,用來存儲轉換結果中的位數。順序棧(ArrayStack):使用數組來實現棧的基本操作,包括入棧(push)、出棧(pop)和判斷棧空(isEmpty)等。鏈棧(LinkedStack):使用鏈表來實現棧的操作,通過鏈表頭部的插入和刪除來模擬棧的入棧和出棧。

③可以在鏈表中增加尾指針,使得插入操作更高效。

④可以通過位運算來加快二進制轉換的速度。使用位運算,而不是依賴除法和取余的方式。

⑤錯誤處理:

????????考慮在代碼中添加錯誤處理機制,例如輸入的十進制數為負數、輸入非法字符等情況下給出相應的提示或處理方式。

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

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

相關文章

CUDA編程之OpenCV與CUDA結合使用

OpenCV與CUDA的結合使用可顯著提升圖像處理性能。 一、版本匹配與環境配置 CUDA與OpenCV版本兼容性? OpenCV各版本對CUDA的支持存在差異,例如OpenCV 4.5.4需搭配CUDA 10.0?2,而較新的OpenCV 4.8.0需使用更高版本CUDA?。 需注意部分模塊(…

WPF從初學者到專家:實戰項目經驗分享與總結

WPF從初學者到專家:實戰項目經驗分享與總結 一、前言二、WPF 基礎概念與入門2.1 什么是 WPF2.2 XAML 基礎2.3 數據綁定基礎 三、第一個 WPF 項目:簡單的待辦事項列表3.1 項目需求分析3.2 項目搭建與界面設計3.3 業務邏輯實現 四、中級項目:音…

一學就會的深度學習基礎指令及操作步驟(3)模型訓練驗證

文章目錄 模型訓練驗證損失函數和優化器模型優化訓練函數驗證函數模型保存 模型訓練驗證 損失函數和優化器 loss_function nn.CrossEntropyLoss() # 損失函數 optimizer Adam(model.parameters()) # 優化器,優化參數模型優化 獲得模型所有的可訓練參數&#x…

Spring Boot 注解大全:全面解析與實戰應用

目錄 一、Spring Boot 啟動與配置相關注解 1.1 SpringBootApplication 1.2 EnableAutoConfiguration 1.3 Configuration 1.4 ComponentScan 二、依賴注入與組件管理注解 2.1 Component 2.2 Service 2.3 Repository 2.4 Controller 2.5 RestController 2.6 Autowired…

【語料數據爬蟲】Python爬蟲|批量采集征集意見稿數據(1)

前言 本文是該專欄的第5篇,后面會持續分享Python爬蟲采集各種語料數據的的干貨知識,值得關注。 在本文中,筆者將主要來介紹基于Python,來實現批量采集“征集意見稿”數據。同時,本文也是采集“征集意見稿”數據系列的第1篇。 采集相關數據的具體細節部分以及詳細思路邏輯…

企業招聘能力提升之道:突破困境,精準納才

企業招聘能力提升之道:突破困境,精準納才 在企業運營的廣袤版圖中,招聘工作無疑是一塊至關重要的拼圖。然而,不少企業在這片領域中舉步維艱,盡管投入了海量的時間與精力,收獲的成果卻不盡人意。面試環節仿…

AI對前端開發的沖擊

Cursor cursor新版本0.46版本號中有部分是改成了新布局其實 Agent 和 Edit 和 Composer 是一樣的,為了方便大家使用,我們把它們合并了,Edit 相當于普通模式下的 Composer,Agent 就是代理模式。 快捷鍵ctrli、ctrll、ctrlk 4o適合…

java中如何把json轉化的字符串再轉化成json格式

使用org.json庫 首先&#xff0c;確保你的項目中已經包含了org.json庫。如果你使用Maven&#xff0c;可以在pom.xml中添加以下依賴&#xff1a; <dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20210307…

泛型、泛型上限、泛型下限、泛型通配符

DAY8.1 Java核心基礎 泛型 Generics 是指在類定義時不指定類中信息的具體數據類型&#xff0c;而是用一個標識符來代替&#xff0c;當外部實例化對象時再指定具體的數據類型。 在定義類或者接口時不明確指定類中信息的具體數據類型&#xff0c;在實例化時再來指定具體的數據類…

Win10 下搭建免費的 FTP 服務器 FileZilla

一、概述 FileZilla 服務器是一個免費的開源FTP和FTPS服務器&#xff0c;是根據GNU通用公共許可證條款免費發布的開源軟件。FileZilla支持FTP、FTPS、SFTP等文件傳輸協議&#xff0c;相比其他FTP服務器&#xff0c;最大的優勢是FileZilla自由(免費)。 FileZilla的官網地址是&a…

C/C++中對字符處理的常用函數

C語言中的 ctype.h 頭文件提供了一系列字符分類和轉換函數&#xff0c;用于高效處理字符相關操作。這些函數通過接受 int 類型參數&#xff08;需為 unsigned char 或 EOF &#xff08;-1&#xff09;值&#xff09;&#xff0c;返回非零值表示條件正確&#xff0c;返回0表示錯…

雙指針算法介紹+算法練習(2025)

一、介紹雙指針算法 雙指針&#xff08;或稱為雙索引&#xff09;算法是一種高效的算法技巧&#xff0c;常用于處理數組或鏈表等線性數據結構。它通過使用兩個指針來遍歷數據&#xff0c;從而減少時間復雜度&#xff0c;避免使用嵌套循環。雙指針算法在解決諸如查找、排序、去重…

【每日八股】計算機網絡篇(四):HTTP

目錄 HTTP 與 HTTPS 的區別&#xff1f;HTTPS 加密與認證的過程&#xff1f;ClientHelloServerHello客戶端回應服務端回應 HTTPS 一定安全可靠嗎&#xff1f;HTTPS 狀態碼的含義&#xff1f;HTTP 緩存有哪些實現方式&#xff1f;HTTP 1.0、HTTP 1.1、HTTP 2.0 和 HTTP 3.0 的區…

TMS320F28P550SJ9學習筆記10:軟件模擬I2C通信_驅動1.3寸OLED

現在有了具體的I2C通信器件&#xff0c;一塊1.3寸OLED屏幕&#xff0c;今日嘗試移植配置一下: 本文主要講的是&#xff0c;使用軟件模擬I2C通信 文章提供測試代碼講解、完整工程下載、測試效果圖 目錄 前置文章&#xff1a; I2C通信引腳&#xff1a; 軟件I2C 引腳的初始化&am…

spring boot 發送郵件驗證碼

一、前置需求 1、準備郵箱 2、登錄授權碼 qq郵箱在–>設置–>賬號POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務 開啟服務 二、發送郵件 1、簡單郵件 包含郵件標題、郵件正文 2、引入mail啟動器 <dependency><groupId>org.springframework.boot</groupI…

塔能科技:智能機箱,為城市安防 “智” 造堅實堡壘

在當今智慧城市建設的浪潮中&#xff0c;城市安防面臨著諸多挑戰。設備管理難&#xff0c;眾多分散的安防設備猶如一盤散沙&#xff0c;難以實現高效統一的管控&#xff1b;數據傳輸不穩定&#xff0c;關鍵時刻信息的延遲或丟失&#xff0c;可能導致嚴重后果。這些問題嚴重制約…

電商數據分析 電商平臺銷售數據分析 電商平臺數據庫設計 揭秘電商怎么做數據分析

《電商參謀數據分析平臺方案》&#xff08;28頁PPT&#xff09;是一套為電商行業量身定制的一體化解決方案&#xff0c;它通過全鏈路打通從數據獲取到分析的全過程&#xff0c;幫助電商企業實現精細化運營和市場機會的挖掘。該方案針對電商行業在數據獲取、加工整合及業務賦能方…

uniapp uview 1.0 跨域h5配置多個代理、如何請求接口

參考文章&#xff1a;uniapp uView1.0跨域h5配置多個代理 官方手冊&#xff1a;http 請求 項目中使用&#xff1a; 參考其他博主的文章是在manifest.json中配置代理&#xff0c;但在官方的手冊中是直接在script請求的&#xff0c;我嘗試請求了下沒問題&#xff0c;上線后也不…

MAVEN解決版本依賴沖突

文章目錄 一、依賴沖突概念1、什么是依賴沖突2、依賴沖突的原因3、如何解決依賴沖突 二、查看依賴沖突-maven-helper1、安裝2、helper使用1、conflicts的閱讀順序&#xff08;從下向上看&#xff09;2、dependencies as List的閱讀順序&#xff08;從下向上看&#xff09;3、de…

79.ScottPlot的MVVM實現 C#例子 WPF例子

如何通過數據綁定在 WPF 中實現動態圖像顯示 在 WPF 應用程序中&#xff0c;通過數據綁定實現動態圖像顯示是一種高效且優雅的方式。以下是一個簡單的教程&#xff0c;展示如何使用 ScottPlot.WPF 庫和 MVVM 模式來實現這一功能。 第一步&#xff1a;安裝必要的 NuGet 包 首…