數據結構:棧、隊列、鏈表

目錄

?隊列

鏈表


? ? ? ? 棧數據結構特點:先入棧的數據后出,此數據結構常用的方法有:入棧push、出棧pop、查看棧頂元素peek等,下方示例以數組實現棧結構

package com.ginko.datastructure;
import lombok.extern.slf4j.Slf4j;/*** 基于數組實現的棧*/
@Slf4j
public class ArrayStack {private int arr[];//棧存放的數據private int top;//棧頂索引/*** 構造棧* @param capacity 棧容量*/public ArrayStack(int capacity) {arr = new int[capacity];top = -1;//初始top為-1}/*** 出棧,從棧頂獲取元素* @return*/public int pop() {if(top == -1) {throw new RuntimeException("棧為空,無法出棧...");}return arr[top--];//出棧后,棧頂下移}/*** 入棧* @param value 入棧數據* @return*/public void push(int value) {if(top == arr.length -1) {throw new RuntimeException("棧已滿,無法入棧...");}arr[++top] = value;//入棧,先將棧頂++}/*** 獲取棧頂數據* @return*/public int peek() {if(top == -1) {throw new RuntimeException("棧為空,沒有棧頂數據...");}return arr[top];}public static void main(String[] args) {ArrayStack arrayStack = new ArrayStack(5);arrayStack.push(100);arrayStack.push(90);arrayStack.push(80);arrayStack.push(60);arrayStack.push(50);log.info("出棧數據:{}",arrayStack.pop()); log.info("出棧數據:{}",arrayStack.pop());log.info("棧頂數據:{}",arrayStack.peek());}
}

? ? ? ? 測試效果如下,復合預期:

隊列

????????隊列數據結構特點:先入隊列的數據先出,此數據結構常用的方法有:入對enQueue、出對deQueue等,下方示例以數組實現隊列結構

package com.ginko.datastructure;
import lombok.extern.slf4j.Slf4j;/*** 基于數組實現的隊列*/
@Slf4j
public class ArrayQueue {private int arr[];//存放隊列元素private int head;//隊列頭指針private int tail;//隊列尾指針private int size;//隊列里面數據的個數/*** 構造隊列* @param capacity 隊列容量*/public ArrayQueue(int capacity) {arr = new int[capacity];head = 0;tail = -1;size = 0;//隊列沒有數據}/*** 入隊* @param value 加入隊列的值*/public void enQueue(int value) {//隊列滿了就不能入隊if(size == arr.length) {throw new RuntimeException("隊列已滿,無法加入隊列...");}//加入隊列加載數組的末尾arr[++tail] = value;size ++;//隊列數據自增}/*** 出隊,從隊列頭獲取數據*/public int deQueue() {//隊列滿了就不能入隊if(size == 0) {throw new RuntimeException("隊列為空,無法出隊列...");}//從隊列頭獲取數據size--;//隊列數據減少return arr[head++];}public static void main(String[] args) {ArrayQueue arrayQueue = new ArrayQueue(5);arrayQueue.enQueue(10);arrayQueue.enQueue(20);arrayQueue.enQueue(30);arrayQueue.enQueue(40);arrayQueue.enQueue(50);log.info("出隊數據:{}",arrayQueue.deQueue());log.info("出隊數據:{}",arrayQueue.deQueue());log.info("隊列元素個數:{}",arrayQueue.size);}
}

????????測試效果如下,復合預期:

鏈表

? ? ? ? 鏈表數據結構特點:通過前后指針串聯起來完整的數據,包含單向鏈表、雙向鏈表等,下方示例演示單向鏈表,核心方法有鏈表插入元素,刪除元素,遍歷鏈表等。

package com.ginko.datastructure;
import lombok.extern.slf4j.Slf4j;/*** 鏈表,單向鏈表,在鏈表的末尾加入數據*/
@Slf4j
public class LinkList {Node head;//頭節點int size;//鏈表中節點的個數public LinkList() {head = null;size = 0;}/*** 加入鏈表,加入鏈表的末尾* @param value*/public void addElement(int value) {if(head == null) {//加入鏈表頭head = new Node(value,null);size ++;//鏈表中節點的個數return;}//找到此鏈表的末尾節點,遍歷后temp節點就是末尾節點Node temp = head;while (temp.next != null) {temp = temp.next;}//新建末尾節點的下一個節點,然后設置末尾節點Node tailNodeNext = new Node(value,null);temp.next = tailNodeNext;size ++;//鏈表中節點的個數}/*** 刪除鏈表中的元素,核心是找到刪除節點的位置* @param value 要刪除的鏈表數據*/public void delElement(int value) {if(head == null) {throw new RuntimeException("鏈表為空,無法刪除元素...");}//刪除表頭節點if(head.value == value) {//要刪除表頭Node headNext = head.next;//直接將head next設置為表頭就刪除表頭了head = headNext;size--;//鏈表中節點的個數}else {//非表頭節點,需要遍歷整個鏈表,查詢出要刪除的節點的上一個節點tempNode temp = head;while (temp.next != null && temp.next.value != value) {temp = temp.next;}if(temp.next.value == value) {if(temp.next != null) {temp.next = temp.next.next;//跳過要刪除的節點,指向下一個節點}else {temp.next = null;}}size--;//鏈表中節點的個數}}/*** 輸出鏈表節點數據*/public void outputLinkInfo() {Node headNode = head;while (headNode != null) {log.info("節點數據:{}",headNode.value);headNode = headNode.next;}}public static void main(String[] args) {LinkList linkList = new LinkList();linkList.addElement(10);linkList.addElement(20);linkList.addElement(30);linkList.addElement(40);linkList.addElement(50);linkList.outputLinkInfo();log.info("鏈表節點數量:{}",linkList.size);linkList.delElement(20);linkList.delElement(50);linkList.outputLinkInfo();log.info("鏈表節點數量:{}",linkList.size);}
}/*** 鏈表中的節點*/
class Node{int value;//節點的值Node next;//鏈表指針,指向下一個節點public Node(int value,Node next) {this.value = value;this.next = next;}
}

????????測試效果如下,復合預期:

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

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

相關文章

Python-難點-uinttest

1 需求要求:unittest.TestCase放在列表中,列表存儲的是腳本文件名import使用動態加載方式:importlib.import_module()unittest.TestLoader使用loadTestsFromModule()2 接口3 示例4 參考資料

開源 python 應用 開發(五)python opencv之目標檢測

最近有個項目需要做視覺自動化處理的工具,最后選用的軟件為python,剛好這個機會進行系統學習。短時間學習,需要快速開發,所以記錄要點步驟,防止忘記。 鏈接: 開源 python 應用 開發(一&#xf…

ABP VNext + OpenTelemetry + Jaeger:分布式追蹤與調用鏈可視化

ABP VNext OpenTelemetry Jaeger:分布式追蹤與調用鏈可視化 🚀 📚 目錄ABP VNext OpenTelemetry Jaeger:分布式追蹤與調用鏈可視化 🚀背景與動機 🌟環境與依賴 📦必裝 NuGet 包系統架構概覽…

C語言中整數編碼方式(原碼、反碼、補碼)

在 C 語言中,原碼、反碼、補碼的運算規則與其編碼特性密切相關,核心差異體現在符號位是否參與運算、進位如何處理以及減法是否能轉化為加法等方面。以下是三者的運算規則及特點分析(以 8 位整數為例,符號位為最高位)&a…

js二維數組如何變為一維數組

在 JavaScript 中,將二維數組轉換為一維數組(扁平化)有多種方法,可根據數組結構復雜度、性能需求和兼容性選擇。以下是最常用的實現方式: 1. 使用 flat() 方法(ES2019) MDN釋義:flat…

Claude code在Windows上的配置流程

前言 昨天在服務器上配置好了 Claude code,發現其編碼性能和效率都非常不錯。 然而,嘗試用它修改帶 UI 界面的客戶端程序時頗為不便,因為服務器沒有圖形化界面,無法直接將應用界面直接顯示到開發機上,調試起來頗為不…

手把手教你用YOLOv10打造智能垃圾檢測系統

無需編程基礎!手把手教你用YOLOv10打造智能垃圾檢測系統 垃圾分類不再難,AI助手秒識別 你是否曾站在分類垃圾桶前猶豫不決?塑料瓶是可回收還是其他垃圾?外賣餐盒到底該丟哪里?隨著垃圾分類政策推廣,這樣的困…

batchnorm類

1. 偽代碼:2. python代碼:3. 測試:4. 加深理解:以 為例,x3,可見輸出的batchnorm后y0.2627.查看模型記錄的均值及方差,計算y0.286799,理解是大致這樣的計算過程。(為什么數…

SpringBoot項目保證接口冪等的五種方法!

1. 冪等概述 1.1 深入理解冪等性 在計算機領域中,冪等(Idempotence)是指任意一個操作的多次執行總是能獲得相同的結果,不會對系統狀態產生額外影響。在Java后端開發中,冪等性的實現通常通過確保方法或服務調用的結果…

SQL新手入門詳細教程和應用實例

SQL(Structured Query Language)是用于管理和操作關系型數據庫的標準語言。它允許你創建、查詢、更新和刪除數據。本教程將從基礎概念開始,逐步引導你上手SQL,并提供詳細的應用實例。教程基于標準SQL語法,實際使用時需根據數據庫系統(如MySQL、SQLite或PostgreSQL)調整。…

DVWA-LOW級-SQL手工注入漏洞測試(MySQL數據庫)+sqlmap自動化注入-小白必看(超詳細)

首次使用DVWA的靶場,咋們先從最低級別的LOW開始,因為之前玩過一下墨者學院,對sql注入有一點認識和理解,所以先從sql的盲注開始; 1、測試注入點是否存在sql注入的漏洞; (1)首先我們…

JAVA線程池詳解+學習筆記

1.線程池基礎概念線程池是一種資源復用技術,通過預先創建并管理一組線程,減少頻繁創建和銷毀線程的開銷。核心思想與數據庫連接池、字符串常量池類似,旨在提升系統性能。核心參數解析ThreadPoolExecutor構造函數包含7個關鍵參數:c…

數據分析庫 Pandas

對于Pandas的簡單認識和基本操作的練習一 介紹 Pandas 是一個開源的數據分析和數據處理庫,它是基于 Python 編程語言的庫。 Pandas 提供了易于使用的數據結構和數據分析工具,特別適用于處理結構化數據,如表格型數據(類似于 Excel …

qt 中不要讓 lambda 槽函數捕獲信號源對象的共享指針

錯誤示例std::shared_ptr<QSerialPort> serial{new QSerialPort{}};QSerialPort::connect(serial.get(),&QSerialPort::readyRead,[serial](){QByteArray receive_data serial->readAll();std::cout.write(receive_data.data(), receive_data.size());});這會直接…

Solidity 合約的編寫-完整開發流程:從編譯、測試、部署到交互

&#x1f9f1; Solidity 合約開發全流程&#xff08;Foundry 版&#xff09;? 適合對象&#xff1a;已經能寫合約但不清楚如何測試、部署、交互的開發者? 工具鏈&#xff1a;Foundry&#xff08;forge, anvil, cast&#xff09;&#x1f4cc; 開發流程總覽1?? 初始化項目 2…

設計模式 - 面向對象原則:SOLID最佳實踐

文章目錄深入理解 SOLID&#xff1a;用對原則&#xff0c;別把簡單問題搞復雜SOLID 原則概覽1. 單一職責原則&#xff08;SRP&#xff09;2. 開閉原則&#xff08;OCP&#xff09;3. 里氏替換原則&#xff08;LSP&#xff09;4. 接口隔離原則&#xff08;ISP&#xff09;5. 依賴…

Vue 3 中父組件內兩個子組件相互傳參的幾種方法

方法一&#xff1a;通過父組件中轉&#xff08;Props Emits&#xff09;<!-- ParentComponent.vue --> <template><ChildA :message-from-b"messageFromB" send-to-b"handleSendToB" /><ChildB :message-from-a"messageFromA&q…

三子棋游戲設計與實現(C 語言版)

一、需求分析目標&#xff1a;實現一個簡單的人機對戰三子棋&#xff0c;支持以下功能&#xff1a;初始化空棋盤&#xff0c;清晰展示落子狀態。玩家通過坐標落子&#xff08;X 代表玩家&#xff09;&#xff0c;電腦隨機落子&#xff08;O 代表電腦&#xff09;。實時判斷勝負…

GD32 CAN1和TIMER0同時開啟問題

背景&#xff1a;今天在一個項目調試的時候發現了一些問題&#xff0c;由此貼記錄一下問題解決的過程。使用的芯片是GD32F305VE。使用到了CAN1和TIMER0。在使用這連個外設的時候發送了一些問題。單獨使用CAN1。功能正常。單獨使用TIMER0。配置為輸出模式。功能正常。但是當兩個…

劍指offer56_數組中唯一只出現一次的數字

數組中唯一只出現一次的數字在一個數組中除了一個數字只出現一次之外&#xff0c;其他數字都出現了三次。 請找出那個只出現一次的數字。 你可以假設滿足條件的數字一定存在。 思考題&#xff1a; 如果要求只使用 O(n) 的時間和額外 O(1) 的空間&#xff0c;該怎么做呢&#xf…