數據結構從入門到精通——順序表

順序表

  • 前言
  • 一、線性表
  • 二、順序表
    • 2.1概念及結構
    • 2.2 接口實現
    • 2.3 數組相關面試題
    • 2.4 順序表的問題及思考
  • 三、順序表具體實現代碼
    • 順序表的初始化
    • 順序表的銷毀
    • 順序表的打印
    • 順序表的增容
    • 順序表的頭部/尾部插入
    • 順序表的頭部/尾部刪除
    • 指定位置之前插入數據和刪除指定位置數據
    • 順序表元素的查找
  • 四、順序表完整代碼
    • text.h
    • text.c
    • main.c


前言

順序表是一種常見的線性數據結構,它使用一段連續的存儲單元依次存儲數據元素。這種數據結構的特點是邏輯上相鄰的元素在物理存儲位置上也相鄰,因此可以快速地訪問表中的任意元素。

順序表的實現通常依賴于數組,數組是一種靜態的數據結構,一旦創建,其大小就是固定的。這意味著在順序表中插入或刪除元素可能會導致空間的浪費或不足。例如,如果在一個已經滿了的順序表中插入一個新元素,就需要重新分配更大的數組空間,并將原有元素復制到新數組中,這是一個相對耗時的操作。

然而,順序表在訪問元素時具有很高的效率。由于元素在內存中是連續存儲的,計算機可以直接通過計算偏移量來訪問任意位置的元素,這種訪問方式的時間復雜度為O(1)。相比之下,鏈表等動態數據結構在訪問元素時可能需要遍歷多個節點,效率較低。

順序表還支持快速的元素查找。通過索引,我們可以在常數時間內找到表中的任意元素。這種特性使得順序表在處理需要頻繁查找操作的場景時表現出色。

總的來說,順序表是一種高效、簡單的數據結構,適用于需要快速訪問和查找元素的場景。然而,它的固定大小特性也限制了其在需要頻繁插入和刪除操作的場景中的應用。在實際應用中,我們需要根據具體的需求和場景來選擇合適的數據結構。


一、線性表

線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串…

線性表在邏輯上是線性結構,也就說是連續的一條直線。但是在物理結構上并不一定是連續的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。

在這里插入圖片描述

二、順序表

2.1概念及結構

順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情況下采用數組存儲。在數組上完成數據的增刪查改。

順序表一般可以分為:

  1. 靜態順序表:使用定長數組存儲元素。
    在這里插入圖片描述
  2. 動態順序表:使用動態開辟的數組存儲。
    在這里插入圖片描述

2.2 接口實現

靜態順序表只適用于確定知道需要存多少數據的場景。靜態順序表的定長數組導致N定大了,空間開多了浪費,開少了不夠用。所以現實中基本都是使用動態順序表,根據需要動態的分配空間大小,所以下面我們實現動態順序表。

typedef int SLDataType;
// 順序表的動態存儲
typedef struct SeqList
{SLDataType* array;  // 指向動態開辟的數組size_t size ;       // 有效數據個數size_t capicity ;   // 容量空間的大小
}SeqList;
// 基本增刪查改接口
// 順序表初始化
void SeqListInit(SeqList* psl);
// 檢查空間,如果滿了,進行增容
void CheckCapacity(SeqList* psl);
// 順序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 順序表尾刪
void SeqListPopBack(SeqList* psl);
// 順序表頭插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 順序表頭刪
void SeqListPopFront(SeqList* psl);
// 順序表查找
int SeqListFind(SeqList* psl, SLDataType x); 
// 順序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
// 順序表刪除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 順序表銷毀
void SeqListDestory(SeqList* psl);
// 順序表打印
void SeqListPrint(SeqList* psl);

2.3 數組相關面試題

  1. 原地移除數組中所有的元素val,要求時間復雜度為O(N),空間復雜度為O(1)
  2. 刪除排序數組中的重復項
  3. 合并兩個有序數組

2.4 順序表的問題及思考

問題:

  1. 中間/頭部的插入刪除,時間復雜度為O(N)
  2. 增容需要申請新空間,拷貝數據,釋放舊空間。會有不小的消耗。
  3. 增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以后增容到
    200,我們再繼續插入了5個數據,后面沒有數據插入了,那么就浪費了95個數據空間。

思考:如何解決以上問題呢?

三、順序表具體實現代碼

順序表的初始化

void SLInit(SL* p);//順序表的初始化
void SLInit(SL* p)
{p->arr = NULL;//動態開辟數組的地址置為空指針p->capacity = 0;//數組容量置為0p->size = 0;//數組下標置為0或-1,具體看你需要哪一種下標
}

順序表的初始化是數據結構學習中不可或缺的一步,它指的是為一個預先分配了固定大小內存空間的線性表分配存儲空間,并設置其初始狀態。在順序表中,數據元素在內存中是連續存放的,這種存儲方式使得我們可以通過下標直接訪問任何位置的元素,從而實現了快速的元素訪問。

順序表的初始化通常包括分配內存空間、設定初始容量、以及可能的初始化所有元素為某一默認值。初始化操作的正確與否直接關系到后續數據操作的效率與正確性。

以C語言為例,順序表可以用數組來實現。在初始化時,我們通常會定義一個結構體來表示順序表,這個結構體包含數組本身、數組的大小(即當前已存儲的元素數量)以及數組的最大容量(即預先分配的內存空間大小)。

順序表的銷毀

void SLDestroy(SL* p);//順序表的銷毀
void SLDestroy(SL* p)
{assert(p);int i = 0; free(p->arr);SLInit(p);
}

在數據結構和算法的世界里,順序表作為一種基本的線性表結構,承載著數據的存儲和訪問功能。然而,正如任何資源的生命周期一樣,順序表的使用也需要在結束時進行適當的銷毀和清理,以確保內存的有效利用和系統的穩定運行。

順序表的銷毀,主要涉及到內存的釋放。當一個順序表不再需要使用時,我們必須將其所占用的內存空間歸還給操作系統,避免內存泄漏。內存泄漏是程序運行過程中未能正確釋放不再使用的內存空間,長時間累積下來會導致可用內存空間減少,最終可能導致程序運行緩慢甚至崩潰。

銷毀順序表的過程通常包括以下步驟:

  1. 遍歷順序表,釋放其中存儲的每一個數據元素。如果數據元素是指針類型,需要確保這些指針指向的內存也被正確釋放。

  2. 釋放順序表本身所占用的內存空間。這通常通過調用相應的內存釋放函數(如C語言中的free()函數)來實現。

  3. 將順序表的頭指針或引用設置為nullnullptr,表示該順序表已經不再有效,防止后續代碼錯誤地訪問或操作已銷毀的順序表。

  4. 在某些情況下,可能還需要進行額外的清理工作,如關閉與順序表相關的文件、釋放其他相關資源等。

通過以上步驟,我們可以確保順序表在不再使用時能夠被正確地銷毀,從而保持程序的內存安全和穩定運行。在實際編程中,我們應該始終遵循資源管理的最佳實踐,確保在適當的時候釋放不再需要的資源,避免內存泄漏和其他潛在問題。

順序表的打印

void SLprint(SL p);//順序表的打印
void SLprint(SL p)
{for (int i = 0; i < p.size; i++){printf("%5d", p.arr[i]);}printf("\n");
}

順序表的打印通常指的是將順序表中的所有元素按照一定的格式輸出到控制臺或其他輸出設備上。這個過程通常涉及到遍歷順序表中的所有元素,并將它們轉換為人類可讀的格式。在打印順序表時,我們通常會選擇一種易于閱讀和理解的方式,如按照元素在表中的順序依次打印,或者使用特定的分隔符將不同的元素分隔開。

順序表的增容

在這里插入圖片描述

void SLCheckCapacity(SL* ps);//順序表的增容
void SLCheckCapacity(SL* p)
{SL* a;assert(p);int Datacapaity = 0;if (p->size == p->capacity){Datacapaity = 0 ? 4 : 2 * p->capacity;//三目運算符a = (DataType*)realloc(p->arr, Datacapaity * sizeof(DataType));//使得擴容按照2倍增長assert(a);p->arr = a;}p->capacity = Datacapaity;
}

順序表是一種線性數據結構,它使用一段連續的存儲空間來存儲元素。當順序表中的元素數量達到其當前容量上限時,就需要進行增容操作,以確保可以繼續添加新的元素。

增容操作的核心思想是為順序表分配更多的連續存儲空間,并將原有的元素復制到新的存儲空間中。這通常涉及到兩個主要步驟:分配新的存儲空間和元素遷移。

分配新的存儲空間是增容操作的第一步。順序表會根據其當前容量和擴容因子來計算出新的容量。擴容因子是一個大于1的常數,用于確定每次增容時應該增加多少存儲空間。例如,如果擴容因子為2,那么每次增容時新的容量將是原容量的兩倍。

在分配了新的存儲空間之后,接下來就是元素遷移的步驟。這一步將順序表中原有的元素從舊的存儲空間復制到新的存儲空間中。為了保證數據的完整性和正確性,復制過程必須小心謹慎地進行。通常,復制過程會從順序表的第一個元素開始,逐個復制到新的存儲空間的相應位置,直到所有元素都被復制完畢。

完成元素遷移后,順序表就可以繼續使用新的存儲空間來存儲新的元素了。同時,順序表的容量上限也得到了提升,可以容納更多的元素。

需要注意的是,增容操作雖然可以擴展順序表的容量,但也會帶來一定的性能開銷。因為每次增容都需要分配新的存儲空間并進行元素遷移,這些操作都需要消耗一定的時間和資源。因此,在設計和實現順序表時,需要權衡擴容的時機和頻率,以避免頻繁的增容操作對性能產生負面影響。

為了優化性能,可以在順序表的使用過程中采取一些策略來減少增容的次數。例如,可以在添加元素之前先檢查順序表的容量是否足夠,如果不足夠則提前進行增容操作,以避免在添加元素時觸發頻繁的增容。此外,還可以根據實際應用場景和數據特點來選擇合適的擴容因子,以平衡存儲空間的利用率和增容操作的開銷。

順序表的頭部/尾部插入

在這里插入圖片描述

//順序表的頭部/尾部插入
void SLPushBack(SL* p, DataType x);
void SLPushFront(SL* p, DataType x);
void SLPushBack(SL* p, DataType x)//順序表的尾插
{assert(p);SLCheckCapacity(p);//增容p->arr[p->size++] = x;
}void SLPushFront(SL* p, DataType x)//順序表的頭插
{assert(p);SLCheckCapacity(p);//增容for (int i = p->size; i > 0; i--){p->arr[i] = p->arr[i - 1];}p->arr[0] = x;p->size++;
}

順序表的頭部/尾部插入是順序表操作中的基本功能,它們直接影響了順序表的數據存儲和訪問效率。順序表,又稱數組列表,是一種線性表的數據結構,其特點是元素在內存中是連續存儲的。這種存儲方式使得順序表在訪問元素時具有很高的效率,因為可以通過下標直接定位到元素的位置。然而,在插入或刪除元素時,順序表的表現就不如鏈表等其他數據結構了。

在順序表的頭部插入元素時,需要將所有已存在的元素向后移動一位,以騰出空間給新插入的元素。這種操作的時間復雜度是O(n),其中n是順序表的長度。因此,對于頻繁在頭部插入元素的場景,順序表并不是最優的數據結構選擇。

相比之下,在順序表的尾部插入元素則相對高效。因為尾部是順序表的一個“開放”端,新元素可以直接添加到這個位置,而不需要移動其他元素。這種操作的時間復雜度是O(1),即常數時間復雜度,意味著無論順序表有多大,尾部插入的效率都是相同的。

在實際應用中,順序表的頭部/尾部插入操作常常用于實現各種算法和數據結構。例如,在某些需要動態維護數據集合的場景中,我們可以使用順序表來存儲數據,并根據需要在頭部或尾部進行插入操作。此外,順序表還可以用于實現棧(Stack)和隊列(Queue)等數據結構,其中棧通常使用順序表的頭部進行插入和刪除操作,而隊列則使用頭部進行刪除操作,使用尾部進行插入操作。

需要注意的是,雖然順序表在訪問元素時具有很高的效率,但在插入和刪除元素時可能會遇到性能瓶頸。因此,在選擇數據結構時,我們需要根據具體的應用場景和需求來權衡各種因素,以選擇最適合的數據結構。

順序表的頭部/尾部刪除

在這里插入圖片描述

在這里插入圖片描述

//順序表的頭部/尾部刪除
void SLPopBack(SL* p);
void SLPopFront(SL* p);
void SLPopBack(SL* p)
{assert(p);assert(p->size);p->size--;
}
void SLPopFront(SL* p)
{assert(p);assert(p->size);for (int i = 0; i < p->size - 1; i++){p->arr[i] = p->arr[i + 1];}p->size--;
}

順序表的頭部/尾部刪除是數據結構中常見的操作,它們分別涉及到對順序表的首個元素和最后一個元素的移除。這兩種操作在多種應用場景中都具有重要的意義,比如緩存管理、消息隊列、數據庫索引等。

在順序表(數組)中實現頭部刪除操作,通常需要將數組中的所有元素向前移動一位,以填補被刪除元素的位置。這種操作的時間復雜度為O(n),其中n為數組的長度。如果順序表是動態分配的,并且有足夠的空間,也可以采用標記刪除的方式,即簡單地將頭部元素標記為已刪除,而不實際移動其他元素。但這種方法需要額外的邏輯來跟蹤哪些元素是已刪除的,因此可能會增加空間和時間上的開銷。

相比之下,尾部刪除操作通常更為簡單和高效。在順序表中,尾部元素總是位于數組的最后一個位置,因此刪除它不需要移動其他元素。只需將數組的最后一個元素的位置標記為未使用,或者如果使用的是動態數組,可以減少其容量以釋放未使用的空間。這種操作的時間復雜度通常為O(1)。

然而,需要注意的是,雖然尾部刪除在單個操作上可能更快,但在頻繁進行頭部刪除的情況下,順序表可能不是最優的數據結構選擇。在這種情況下,使用鏈表可能更為合適,因為鏈表在頭部和尾部刪除操作上的時間復雜度都是O(1)。

指定位置之前插入數據和刪除指定位置數據

//指定位置之前插入數據
//刪除指定位置數據
void SLInsert(SL* p, int pos, DataType x);
void SLErase(SL* p, int pos);
void SLInsert(SL* p, int pos, DataType x)
{assert(p);assert(pos>=0 && pos <= p->size);SLCheckCapacity(p);for (int i = p->size; i >= pos; i--){p->arr[i] = p->arr[i - 1];}p->arr[pos] = x;p->size++;
}
void SLErase(SL* p, int pos)
{assert(p);assert(pos >= 0 && pos <= p->size);for (int i = pos - 1; i < p->size; i++){p->arr[i] = p->arr[i + 1];}p->size--;
}

指定位置之前插入數據和刪除指定位置數據是編程中常見的操作,尤其在處理列表、數組、字符串等數據結構時。這些操作不僅對于數據的管理和維護至關重要,而且在很多算法和程序設計中也扮演著重要角色。

在插入數據時,我們通常需要考慮以下幾個因素:插入的位置、要插入的數據以及插入后數據結構的完整性。

在刪除指定位置的數據時,我們需要確保刪除操作不會破壞數據結構的其余部分。
需要注意的是,在進行插入和刪除操作時,我們需要確保索引的有效性。如果索引超出數據結構的范圍,那么程序會拋出異常。因此,在實際編程中,我們通常需要在進行這些操作之前先檢查索引的有效性。

此外,插入和刪除操作的時間復雜度也是我們需要考慮的因素。在大多數數據結構中,插入和刪除操作的時間復雜度都是O(n),其中n是數據結構的長度。這意味著,隨著數據結構的增長,這些操作所需的時間也會增加。因此,在選擇數據結構時,我們需要根據實際需求來權衡各種因素,包括插入和刪除操作的頻率、數據結構的長度以及所需的空間等。

總的來說,指定位置之前插入數據和刪除指定位置數據是編程中常見的操作,我們需要熟練掌握這些操作的方法和技巧,以便在實際編程中能夠靈活應用。同時,我們還需要注意操作的有效性和時間復雜度等問題,以確保程序的正確性和效率。

順序表元素的查找

//順序表元素的查找
int SLFind(SL p, DataType x);
int SLFind(SL* p, DataType x)
{assert(p);for (int i = 0; i < p->size; i++){if (p->arr[i] == x)return i + 1;}return -1;
}

順序表元素的查找是計算機科學中的一個基本問題,它涉及到在一個有序或無序的列表中查找特定的元素。在各種實際應用中,如數據庫管理、搜索引擎、編程語言中的數據結構等,順序表元素的查找都扮演著重要的角色。

對于順序表元素的查找,最基礎的算法是線性查找。線性查找的思想是從表的第一個元素開始,逐個比較每個元素,直到找到目標元素或遍歷完整個表。這種查找方法的時間復雜度為O(n),其中n為表的長度。雖然線性查找簡單易懂,但在處理大數據量時,其效率往往不能滿足要求。

為了提高查找效率,人們設計了更為高效的查找算法,如二分查找。二分查找只適用于有序的順序表,其基本思想是將表分為兩半,通過比較目標元素與中間元素的大小,決定在哪一半繼續查找,如此反復,直到找到目標元素或確定目標元素不存在于表中。二分查找的時間復雜度為O(log n),在數據量較大時,其效率遠高于線性查找。

除了二分查找,還有一些其他的查找算法,如插值查找和斐波那契查找等。插值查找是對二分查找的一種改進,它根據目標元素在表中的大致位置,選擇一個更接近于目標元素的中間元素進行比較,從而減少比較次數。斐波那契查找則是利用斐波那契數列的性質,通過計算斐波那契數來確定查找范圍,進一步提高查找效率。

在實際應用中,選擇哪種查找算法取決于具體的需求和場景。對于有序的順序表,二分查找、插值查找和斐波那契查找等高效算法是更好的選擇;而對于無序的順序表,線性查找可能是唯一可行的選擇。此外,還可以根據表的大小、元素的分布等因素來選擇合適的查找算法。

四、順序表完整代碼

text.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int DataType;靜態順序表
//typedef struct Seqlist
//{
//	DataType data[10];
//	int size;
//}Seqlist;//動態順序表
typedef struct Seqlist
{DataType* arr;int size;int capacity;
}SL;void SLCheckCapacity(SL* ps);//順序表的增容void SLInit(SL* p);//順序表的初始化
void SLDestroy(SL* p);//順序表的銷毀
void SLprint(SL p);//順序表的打印//順序表的頭部/尾部插入
void SLPushBack(SL* p, DataType x);
void SLPushFront(SL* p, DataType x);//順序表的頭部/尾部刪除
void SLPopBack(SL* p);
void SLPopFront(SL* p);//指定位置之前插入數據
//刪除指定位置數據
void SLInsert(SL* p, int pos, DataType x);
void SLErase(SL* p, int pos);
int SLFind(SL p, DataType x);

text.c

#include"text.h"
void SLCheckCapacity(SL* p)
{SL* a;assert(p);int Datacapaity = 0;if (p->size == p->capacity){Datacapaity = 0 ? 4 : 2 * p->capacity;a = (DataType*)realloc(p->arr, Datacapaity * sizeof(DataType));assert(a);p->arr = a;}p->capacity = Datacapaity;
}void SLInit(SL* p)
{p->arr = NULL;p->capacity = 0;p->size = 0;
}
void SLDestroy(SL* p)
{int i = 0; for (i = 0; i < p->size; i++){free(p->arr[i]);}SLInit(p);
}
void SLprint(SL p)
{for (int i = 0; i < p.size; i++){printf("%5d", p.arr[i]);}printf("\n");
}void SLPushBack(SL* p, DataType x)
{assert(p);SLCheckCapacity(p);p->arr[p->size++] = x;
}void SLPushFront(SL* p, DataType x)
{assert(p);SLCheckCapacity(p);for (int i = p->size; i > 0; i--){p->arr[i] = p->arr[i - 1];}p->arr[0] = x;p->size++;
}void SLPopBack(SL* p)
{assert(p);assert(p->size);p->size--;
}
void SLPopFront(SL* p)
{assert(p);assert(p->size);for (int i = 0; i < p->size - 1; i++){p->arr[i] = p->arr[i + 1];}p->size--;
}void SLInsert(SL* p, int pos, DataType x)
{assert(p);assert(pos>=0 && pos <= p->size);SLCheckCapacity(p);for (int i = p->size; i >= pos; i--){p->arr[i] = p->arr[i - 1];}p->arr[pos] = x;p->size++;
}
void SLErase(SL* p, int pos)
{assert(p);assert(pos >= 0 && pos <= p->size);for (int i = pos - 1; i < p->size; i++){p->arr[i] = p->arr[i + 1];}p->size--;
}int SLFind(SL* p, DataType x)
{assert(p);for (int i = 0; i < p->size; i++){if (p->arr[i] == x)return i + 1;}return -1;
}

main.c

#include"text.h"void slTest01() {SL sl;SLInit(&sl);SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLprint(sl);      //1 2 3 4SLPushBack(&sl, 5);SLprint(sl);SLPushFront(&sl, 5);SLPushFront(&sl, 6);SLPushFront(&sl, 7);SLprint(sl);       //7 6 5 1 2 3 4SLPopBack(&sl);SLPopBack(&sl);SLPopBack(&sl);SLPopBack(&sl);SLprint(sl);   //1 2SLPopFront(&sl);SLPopFront(&sl);SLPopFront(&sl);//SLPopFront(&sl);SLprint(sl);   //3 4//SLInsert(&sl, 0, 100);//SLprint(sl); //100 1 2 3 4//SLInsert(&sl, sl.size, 200);//SLprint(sl); //100 1 2 3 4 200//SLInsert(&sl, 100, 300);//SLprint(sl);//SLErase(&sl, 0);//SLprint(sl);  //2 3 4//SLErase(&sl, sl.size - 1);//SLErase(&sl, 1);//SLprint(sl);//1 3 4
}int main()
{slTest01();return 0;
}

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

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

相關文章

Linux如何查看端口是否占用

在Linux中&#xff0c;有多種方法可以用來檢查端口是否被占用。以下是一些常用的命令&#xff1a; netstat&#xff1a;這是一個非常通用的命令&#xff0c;可以用來查看所有端口的使用情況。如果你想查找特定的端口是否被占用&#xff0c;可以使用netstat命令配合grep。例如&…

【MySQL】DQL

DQL&#xff08;數據查詢語言&#xff09;用于在MySQL數據庫中執行數據查詢操作。它主要包括SELECT語句&#xff0c;用于從表中檢索數據。 0. 基本語法 SELECT 字段列表 FROM 表名列表 WHERE 條件列表 GROUP BY 分組字段列表 HAVING 分組后條件列表 ORDER BY 排序字段列表 …

未來醫療技術的發展方向在Python中的重要性

未來醫療技術的發展方向在Python中的重要性體現在以下幾個方面&#xff1a; 數據分析和人工智能&#xff1a;Python作為一種強大的數據分析語言&#xff0c;可以進行大規模的數據處理、分析和挖掘。在醫療領域&#xff0c;大量的醫療數據可以通過Python進行分析&#xff0c;幫助…

【市工信】2024年青島市綠色工廠、綠色工業園區等綠色制造示范申報

科大睿智小編從青島市工信局了解到&#xff0c;為深入貫徹綠色發展理念&#xff0c;牢固樹立綠色低碳發展導向&#xff0c;進一步完善綠色制造體系&#xff0c;培育綠色制造先進典型&#xff0c;根據《工業和信息化部關于印發<綠色工廠梯度培育及管理暫行辦法>的通知》&a…

springcloud:3.1介紹雪崩和Resilience4j

災難性雪崩效應 簡介 服務與服務之間的依賴性,故障會傳播,造成連鎖反應,會對整個微服務系統造成災難性的嚴重后果,這就是服務故障的“雪崩”效應。 原因 1.服務提供者不可用(硬件故障、程序bug、緩存擊穿、用戶大量請求) 2.重試加大流量(用戶重試,代碼邏輯重試) 3.服…

在golang中使用protoc

【Golang】proto生成go的相關文件 推薦個人主頁&#xff1a;席萬里的個人空間 文章目錄 【Golang】proto生成go的相關文件1、查看proto的版本號2、安裝protoc-gen-go和protoc-gen-go-grpc3、生成protobuff以及grpc的文件 1、查看proto的版本號 protoc --version2、安裝protoc-…

Acwing 周賽132 解題報告 | 珂學家 | 并查集 + floyd尋路

前言 整體評價 A. 大小寫轉換 Q: 把字符串s統一成小寫字母形態 題型&#xff1a;簽到 知識點: 考察字符串的API題 c可以借助transform函數&#xff0c;進行轉化 #include <bits/stdc.h>using namespace std;int main() {string s;cin >> s;// 把自己轉化為小寫…

10-Java裝飾器模式 ( Decorator Pattern )

Java裝飾器模式 摘要實現范例 裝飾器模式&#xff08;Decorator Pattern&#xff09;允許向一個現有的對象添加新的功能&#xff0c;同時又不改變其結構 裝飾器模式創建了一個裝飾類&#xff0c;用來包裝原有的類&#xff0c;并在保持類方法簽名完整性的前提下&#xff0c;提供…

代購程序api接口采集商品信息接入演示示例

以下是一個使用Java編寫的簡單示例&#xff0c;演示如何通過API接口采集商品信息并接入到代購程序中&#xff1a; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; impor…

vue使用swiper(輪播圖)-真實項目使用

一、安裝 我直接安裝的vue-awesome-swiper": "^3.1.3"指定版本 npm install vue-awesome-swiper3.1.3 swiper --save二、vue頁面使用&#xff0c;寫了一個小demo <template><div class"vue-swiper"><h1>{{ msg }}</h1><…

陶瓷工業5G智能制造工廠數字孿生可視化平臺,推進行業數字化轉型

陶瓷工業5G智能制造工廠數字孿生可視化平臺&#xff0c;推進行業數字化轉型。在陶瓷工業領域&#xff0c;5G智能制造工廠數字孿生可視化平臺的應用正在改變著行業的傳統生產模式&#xff0c;推動著數字化轉型的進程。本文將圍繞這一主題展開探討&#xff0c;分析數字孿生可視化…

Unity GC + C# GC + Lua GC原理

Unity垃圾回收原理 參考文章&#xff1a;垃圾回收 (計算機科學) - 維基百科&#xff0c;自由的百科全書 (wikipedia.org) 在計算機科學中&#xff0c;垃圾回收&#xff08;英語&#xff1a;Garbage Collection&#xff0c;縮寫為GC&#xff09;是指一種自動的存儲器管理機制。…

配置之道:深入研究Netty中的Option選項

歡迎來到我的博客&#xff0c;代碼的世界里&#xff0c;每一行都是一個故事 配置之道&#xff1a;深入研究Netty中的Option選項 前言Option的基礎概念ChannelOption與Bootstrap Option常見的ChannelOption類型ChannelConfig的使用Option的生命周期不同傳輸協議的Option 前言 在…

Linux下檢查端口占用

很多網站都給出方法檢查出端口占用的進程&#xff0c;直接就kill掉&#xff0c;并不檢查占用進程的詳細情況&#xff0c;如&#xff1a;https://www.runoob.com/w3cnote/linux-check-port-usage.html 正常情況下&#xff0c;需要對進程進行檢查 ls /proc/進程ID -l

Tomcat部署Web服務器及基礎功能配置

前言 Tomcat作為一款網站服務器&#xff0c;目前市面上Java程序使用的比較多&#xff0c;作為運維工人&#xff0c;有必要了解一款如何去運行Java環境的網站服務。 目錄 一、Java相關介紹 1. Java歷史 2. Java跨平臺服務 3. Java實現動態網頁功能 3.1 servelt 3.2 jsp …

Revit-二開之創建TextNote-(1)

Revit二開之創建TextNote TextNode在Revit注釋模塊中&#xff0c;具體位置如圖所示 圖中是Revit2018版本 【Revit中的使用】 Revit 中的操作是點擊上圖中的按鈕在平面視圖中點擊任意放置放置就行&#xff0c; 在屬性中可以修改文字 代碼實現 創建TextNode ExternalComm…

Web Tomcat

目錄 1 前言2 Tomcat的安裝3 Tomcat文件的構成4 Tomcat的使用步驟 1 前言 Tomcat是一個 http(web)的容器&#xff0c;籠統的理解一下所有的網站都叫做web。這個web容器可以把我們的前端(htmlcssjs)和后端(servlet)代碼都運行起來。 Tomcat是一個免費的開源的Servlet容器&#…

Flutter中的三棵樹

Widget Tree&#xff1a; 頁面配置信息。 Element Tree&#xff1a; Widget tree的實例化對象&#xff0c;創建出renderObject&#xff0c;并關聯到element.renderobject屬性上&#xff0c;最后完成RenderObject Tree的創建。 RenderObject Tree&#xff1a;完成布局和圖層繪制…

【C++ 函數重載】

C 函數重載 ■ C 函數重載簡介■ C 運算符重載■ 一元運算符重載■ 二元運算符重載 &#xff08;&#xff0c;-&#xff0c;*&#xff0c;/&#xff09;■ 關系運算符重載 &#xff08; < 、 > 、 < 、 > 、 等等&#xff09;■ 輸入/輸出運算符重載&#xff08;運…

【嵌入式學習】網絡編程day03.02

一、項目 1、TCP機械臂測試 #include <myhead.h> #define SER_IP "192.168.126.32" #define SER_PORT 8888 #define CER_IP "192.168.126.42" #define CER_PORT 9891 int main(int argc, const char *argv[]) {int wfd-1;//創建套接字if((wfdsocke…