隊列的實現和OJ練習(c語言)

目錄

概念

隊列的實現

利用結構體存放隊列結構

為什么單鏈表不使用這種方法?

初始化隊列

小提示:

隊尾入隊列

隊頭出隊列

獲取隊頭元素

獲取隊尾元素

獲取隊列中有效元素個數

檢測隊列是否為空

銷毀隊列

最終代碼

循環隊列?

隊列的OJ題

用隊列實現棧

用棧實現隊列


概念

只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出FIFO(First In First Out) 的特性,進行插入操作的一端稱為隊尾,進行刪除操作的一端稱為隊頭

隊列的實現

tip:隊列也可以數組和鏈表的結構實現,使用鏈表的結構實現更優一些,因為如果使用數組的結構,出隊列在數組頭上出數據,效率會比較低。

利用結構體存放隊列結構

????????我們之前在實現單鏈表的時候使用到了二級指針來達到修改頭尾結點的效果,這樣會增加代碼復雜性和理解難度......

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//鏈式結構:表示隊列
typedef int QDataType;
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;//隊列的結構(使用結構體避免了二級指針的使用)
typedef struct Queue
{QNode* phead;QNode* ptail;int size;        //存放隊列大小
}Queue;

????????現在我們依然選擇用單鏈表實現隊列,但是我們將指向鏈表的頭尾結點的指針信息都存放在一個結構體中,這樣就起到了簡化參數傳遞的作用。即在初始化隊列時只需分配一個包含頭尾節點、隊列大小等信息的結構對象,并將其作為參數傳遞給相關函數。這樣就可以直接通過訪問該結構對象中的相應成員變量來修改或獲取所需信息

為什么單鏈表不使用這種方法?

????????這是因為在單鏈表中,使用結構體來表示整個單鏈表可能會帶來一些不必要的復雜性,并且沒有明顯的好處,相比于這種方法使用二級指針會有以下有點:

1. 簡化插入和刪除操作:由于插入或刪除操作需要調整前后兩個節點之間的連接關系(而隊列不需要考慮在指定位置插入的問題),將頭尾結點分別存放在結構體中可能需要更多額外處理步驟才能保持正確連接關系。

2. 節省內存空間:如果每個節點都包含了頭尾信息,則會導致額外占用內存空間,并且增加了維護數據一致性所需付出成本。

3. 降低復雜度:通過僅保存對首元素(即頭部)進行引用,在大多數情況下足以滿足對單鏈表進行各種操作所需求。這樣可以簡化代碼邏輯并提高代碼可讀性與可維護性。

初始化隊列

//初始化隊列
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}

實現步驟:?

1、利用斷言檢測隊列指針的有效性

2、有效則將隊列初始化為空隊列,即將指向隊頭元素和隊尾元素的指針及隊列元素個數都置為空

小提示:

這個看不看都行

隊尾入隊列

//隊尾入隊列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->ptail == NULL){pq->ptail = pq->phead = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}

實現步驟:?

1、利用斷言檢測隊列指針的有效性

2、malloc申請新的結點空間,并進行開辟失敗的判斷

3、若開辟成功則向鏈表結點中插入有效數據,以及下一個結點的置空

4、檢測隊列是否為空,若為空則將新申請的結點作為隊列的第一個元素,令指向隊頭和隊尾的指針指向該元素

5、若不為空,則將指向隊尾元素的指針指向新元素,同時將指向隊尾的指針向后移動指向該元素

6、完成一次隊尾入隊操作后,將隊列元素個數加一

隊頭出隊列

// 對頭出隊列
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead);QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;if (pq->phead == NULL)pq->ptail = NULL;pq->size--;
}

實現步驟:?

1、利用斷言檢測隊列指針的有效性

2、利用斷言檢測隊列頭元素不為空

3、利用臨時指針變量刪除隊頭結點,并將指向隊頭結點指針向后移動,最后釋放該指針并置空

4、隊頭元素出隊列后,若頭指針變為空,則將尾指針也變為空

獲取隊頭元素

//獲取隊頭元素
QDataType QueueFront(Queue* pq)
{assert(pq);// assert(pq->phead);return pq->phead->val;
}

實現步驟:?

1、利用斷言檢測隊列指針的有效性

2、利用斷言檢測隊列頭元素不為空

3、返回此時隊頭元素的值

獲取隊尾元素

//獲取隊頭元素
QDataType QueueFront(Queue* pq)
{assert(pq);// assert(pq->phead);return pq->phead->val;
}

實現步驟:?

1、利用斷言檢測隊列指針的有效性

2、利用斷言檢測隊列頭元素不為空

3、返回此時隊尾元素的值

獲取隊列中有效元素個數

//獲取隊列中有效元素個數
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

實現步驟:?

1、利用斷言檢測隊列指針的有效性

2、返回結構體中的size值

檢測隊列是否為空

//檢測隊列是否為空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}

實現步驟:?

1、利用斷言檢測隊列指針的有效性

2、返回對pq->phead == NULL的判斷結果,返回結果為真則隊列為空,為假則隊列非空

銷毀隊列

//銷毀隊列
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}

實現步驟:?

1、利用斷言檢測隊列指針的有效性

2、遍歷每一個隊頭元素并銷毀,最后將頭尾指針及隊列元素數量均置為空

最終代碼

Queue.h文件

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//鏈式結構:表示隊列
typedef int QDataType;
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;//隊列的結構(使用結構體避免了二級指針的使用)
typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//初始化隊列
void QueueInit(Queue* pq);//隊尾入隊列
void QueueDestroy(Queue* pq);//隊頭出隊列
void QueuePush(Queue* pq, QDataType x);//獲取隊頭元素
void QueuePop(Queue* pq);//獲取隊尾元素
QDataType QueueFront(Queue* pq);//獲取隊列中有效元素個數
QDataType QueueBack(Queue* pq);//檢測隊列是否為空
bool QueueEmpty(Queue* pq);//銷毀隊列
int QueueSize(Queue* pq);

Queue.c文件

#include"Queue.h"//初始化隊列
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}//銷毀隊列
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}//隊尾入隊列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->ptail == NULL){pq->ptail = pq->phead = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}// 對頭出隊列
void QueuePop(Queue* pq)
{assert(pq);// assert(pq->phead);QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;if (pq->phead == NULL)pq->ptail = NULL;pq->size--;
}//獲取隊頭元素
QDataType QueueFront(Queue* pq)
{assert(pq);// assert(pq->phead);return pq->phead->val;
}//獲取隊尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);// assert(pq->ptail);return pq->ptail->val;
}//檢測隊列是否為空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}//獲取隊列中有效元素個數
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

test.c文件

#include "Queue.h"int main()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);printf("%d ", QueueFront(&q));QueuePop(&q);printf("%d ", QueueFront(&q));QueuePop(&q);QueuePush(&q, 4);QueuePush(&q, 5);while (!QueueEmpty(&q)){printf("%d ", QueueFront(&q));QueuePop(&q);}QueueDestroy(&q);return 0;
}

循環隊列?

概念:循環隊列是一種特殊的隊列數據結構,它通過使用固定大小的數組來實現。與普通隊列不同的是,在循環隊列中,當尾指針(rear)達到數組末尾時,會從數組開頭重新開始存儲元素

優點:充分利用出隊操作后釋放出來的空間,避免頻繁地移動元素

適用場景:循環隊列常用于需要高效處理連續輸入輸出流數據的場景,如緩沖區、任務調度等

關于循環隊列的實現放在下一篇文章......

隊列的OJ題

用隊列實現棧

225. 用隊列實現棧 - 力扣(LeetCode)

具體解題思路如下:

1、題目要求使用兩個隊列,但隊列的基本功能需要自己實現

2、利用棧的結構體存儲兩個隊列的頭尾指針及隊列元素個數的信息

3、為隊列申請結點空間并利用QueueInit函數初始化隊列

4、 入棧時,利用if判斷誰為非空隊列后,將要入棧的元素尾插進非空隊列中(QueueBack函數),出棧的大體過程如下圖所示:

5、出棧時,為了將隊列的最后一個元素先排出,就需要讓原來存儲有效數據的隊列的前N-1個元素放入空的隊列中,然后再將元隊列中的最后一個元素排出,兩個隊列的作用是來回切換的需要利用if語句判斷隊列的空與非空后在進行操作,出棧的大體過程如下圖所示:

6、獲取棧頂元素時,只需要判斷兩個隊列誰不為空,將不為空的隊列的隊尾元素返回即可

7、判斷棧是否為空時,當兩個隊列均為空時棧才能為空,所以需要用&&

8、銷毀棧時、不僅要釋放掉malloc申請的內存空間,還要將兩個隊列一同銷毀

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//鏈式結構:表示隊列
typedef int QDataType;
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;//隊列的結構(使用結構體避免了二級指針的使用)
typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//初始化隊列
void QueueInit(Queue* pq);//隊尾入隊列
void QueueDestroy(Queue* pq);//隊頭出隊列
void QueuePush(Queue* pq, QDataType x);//獲取隊頭元素
void QueuePop(Queue* pq);//獲取隊尾元素
QDataType QueueFront(Queue* pq);//獲取隊列中有效元素個數
QDataType QueueBack(Queue* pq);//檢測隊列是否為空
bool QueueEmpty(Queue* pq);//銷毀隊列
int QueueSize(Queue* pq);//初始化隊列
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}//銷毀隊列
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}//隊尾入隊列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->ptail == NULL){pq->ptail = pq->phead = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}// 對頭出隊列
void QueuePop(Queue* pq)
{assert(pq);// assert(pq->phead);QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;if (pq->phead == NULL)pq->ptail = NULL;pq->size--;
}//獲取隊頭元素
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}//獲取隊尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}//檢測隊列是否為空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}//獲取隊列中有效元素個數
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}typedef struct {Queue q1;Queue q2;  
} MyStack;//初始化棧
MyStack* myStackCreate() {//申請結點空間MyStack* pst = (MyStack*)malloc(sizeof(MyStack));//取地址后就可以操作棧結構體中p1和p2中的內容QueueInit(&pst->q1);       //->的優先級大于&QueueInit(&pst->q2);       //->的優先級大于&return pst;
}//入棧
void myStackPush(MyStack* obj, int x) {//如果q1隊列不為空則q1隊列用于存放導出的數據if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1,x);}//如果q1隊列為空則q2隊列用于存放導出的數據else{QueuePush(&obj->q2,x);}
}//出棧
int myStackPop(MyStack* obj) {//起始假設q1為空,q2不為空,empty指針指向空隊列,noempty指向非空隊列Queue* empty = &obj->q1;Queue* noempty = &obj->q2;//如果我們假設失敗則證明q1不為空,q2為空,交換標志if(!QueueEmpty(&obj->q1)){empty = &obj->q2;noempty = &obj->q1;}//然后將隊列中的前N-1個元素導入空隊列,所以循環結束的條件就是隊列中元素等于1(這個剩下的就是要出棧的元素)while(QueueSize(noempty) > 1){QueuePush(empty,QueueFront(noempty));QueuePop(noempty);}//將隊列中前N-1個元素導出后剩余的就是要出棧的元素,將該元素存儲進整型變量top中int top = QueueFront(noempty);//存儲完成后將該元素也進行出隊列操作QueuePop(noempty);//最后返回要出棧的元素return top;
}//獲取棧頂元素
int myStackTop(MyStack* obj) {//誰不為空就獲取誰的隊尾元素if(!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}//如果q1隊列為空則q2隊列用于存放導出的數據else{return QueueBack(&obj->q2);}
}//判斷棧是否為空
bool myStackEmpty(MyStack* obj) {//只有當兩個隊列均為空的時候,該棧才不會有有效數據return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}//銷毀棧
void myStackFree(MyStack* obj) {//初始化時除了malloc了一個結點,還初始化了兩個隊列,所以除了要將申請的結點釋放還要將申請的兩個隊列銷毀QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

關于&pst->q1的解釋:

為了操作隊列,我們在初始化棧時需要將隊列對象作為參數傳遞給函數,即&pst->q1,表示獲取指針?pst?所指向的結構體中成員變量 q1?的地址(可以理解為隊列q1的地址),而pst是一個指向MyStack結構體的指針,所以說就是獲取MyStack結構體中成員變量的地址。

用棧實現隊列

232. 用棧實現隊列 - 力扣(LeetCode)

具體解題思路如下:

1、題目要求使用兩個棧,但棧的基本功能需要自己實現

2、利用棧的結構體存儲兩個隊列的頭尾指針及隊列元素個數的信息

3、為棧申請結點空間并利用STInit函數初始化棧

4、入隊時,直接利用STPush函數進行入棧即可

5、先返回隊頭元素然后再出隊,先判斷用于出數據的popst棧是否為空,如果為空則將pushst棧中的數據倒順序后放入popst棧中,利用STPush函數將pushst棧的棧頂元素放入空的popst棧中

6、出隊時,用臨時變量front接收返回的隊頭元素,然后利用STPop函數將該元素出隊,最后返回該元素的值

7、判斷隊列是否為空時,當兩個棧均為空時隊列才能為空,所以需要用&&

8、銷毀棧時、不僅要釋放掉malloc申請的內存空間,還要將兩個棧一同銷毀

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>//支持動態增長的棧
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;	  //表示棧頂位置int capacity; //棧的容量
}ST;// 初始化棧
void STInit(ST* ps);// 銷毀棧
void STDestroy(ST* ps);// 入棧
void STPush(ST* ps, STDataType data);// 出棧
void STPop(ST* ps);// 獲取棧頂元素
STDataType STTop(ST* ps);// 獲取棧中有效元素個數
int STSize(ST* ps);// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0 
int STEmpty(ST* ps);// 初始化棧
void STInit(ST* pst)
{//首先要指向一個棧assert(pst);pst->a = NULL;pst->capacity = 0;pst->top = 0;    //令pop表示棧頂元素的下一個元素的下標
}// 銷毀棧
void STDestroy(ST* pst)
{//首先要指向一個棧assert(pst);//正常操作不再過多復述free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}//入棧
void STPush(ST* pst, STDataType x)
{//首先要指向一個棧assert(pst);//判斷棧是否已滿,如果棧滿則申請新的內存空間if (pst->top == pst->capacity){int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newCapacity;}//如果棧未滿則進行入棧操作(若初始化時pop=-1,則下面兩行代碼交換執行順序)pst->a[pst->top] = x;    //此時pop表示的是棧頂元素的下一個元素的下標 pst->top++;              //top表示的下標數++
}//出棧
void STPop(ST* pst)
{//首先要指向一個棧assert(pst);//top<0表示棧為空,top=0表示沒有元素入棧,存在這兩種情況就不能執行出棧操作(可以提供的圖理解)assert(pst->top > 0);//直接對top執行減減操作以獲取實際數組元素下標pst->top--;
}// 獲取棧頂元素
STDataType STTop(ST* pst)
{//首先要指向一個棧assert(pst);//top<0表示棧為空,top=0表示沒有元素入棧,存在這兩種情況就不能執行出棧操作(可以提供的圖理解)assert(pst->top > 0);//當初始化top=0時,top的值與實際數組元素下標的值之間的關系是:實際下標 = top-1//所以這里要進行減一操作得到實際的數組元素下標后再輸出return pst->a[pst->top - 1];
}//獲取棧中有效元素個數
int STSize(ST* pst)
{//首先要指向一個棧assert(pst);//初始化top=0,則top等于多少棧中就有多少個元素return pst->top;
}//檢測棧是否為空,如果為空返回非零結果,如果不為空返回0 
int STEmpty(ST* pst)
{//首先要指向一個棧assert(pst);//如果pst->top不為空則返回結果為真,為空則返回假return pst->top == NULL;
}typedef struct {ST pushst;ST popst;    
} MyQueue;//初始化棧
MyQueue* myQueueCreate() {MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));STInit(&obj->pushst);STInit(&obj->popst);return obj;
}//入隊
void myQueuePush(MyQueue* obj, int x) {STPush(&obj->pushst,x);
}//出隊
int myQueuePop(MyQueue* obj) {int front = myQueuePeek(obj);STPop(&obj->popst);return front;
}//返回隊頭元素
int myQueuePeek(MyQueue* obj) {//棧不為空就倒數據if(STEmpty(&obj->popst)){//將pusust里面的數據倒轉順序后傳遞給popstwhile(!STEmpty(&obj->pushst)){STPush(&obj->popst, STTop(&obj->pushst));STPop(&obj->pushst);}}return STTop(&obj->popst);
}//判斷是否為空
bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->popst) && STEmpty(&obj->pushst);
}//銷毀隊
void myQueueFree(MyQueue* obj) {STDestroy(&obj->popst);STDestroy(&obj->pushst);
}/*** Your MyQueue struct will be instantiated and called as such:* MyQueue* obj = myQueueCreate();* myQueuePush(obj, x);* int param_2 = myQueuePop(obj);* int param_3 = myQueuePeek(obj);* bool param_4 = myQueueEmpty(obj);* myQueueFree(obj);
*/

關于&pst->pushst和&pst->popst的解釋:

~over~?

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

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

相關文章

元素清空操作clear與選擇操作check

元素清空操作clear與選擇操作check clear() 作用 清空輸入框的所有內容.clear() 等價于 .type("{selectall}{backspace}") 語法 .clear() .clear(options)option選項 元素選中操作check與uncheck check 語法 // 所有匹配到的選擇框都會被選中一遍 .check()/…

CISP模擬考試(二)

免責聲明 文章僅做經驗分享用途,利用本文章所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,作者不為此承擔任何責任,一旦造成后果請自行承擔!!! 1.DDoS攻擊主要目的是: A.破壞完整性 B.破壞機密性 C.破壞可用性 D.破壞不可抵賴性 答案:…

三、防火墻-源NAT

學習防火墻之前&#xff0c;對路由交換應要有一定的認識 源NAT基本原理1.1.NAT No-PAT1.2.NAPT1.3.出接口地址方式&#xff08;Easy IP&#xff09;1.4.Smart NAT1.5.三元組 NAT1.6.多出口場景下的源NAT 總結延伸 ——————————————————————————————…

C語言prim算法求最小生成樹

Prim算法是一種用于尋找無向帶權圖的最小生成樹的算法。該算法的基本思想是從一個源點開始&#xff0c;逐步向外擴展生成樹&#xff0c;每次找到與當前生成樹最近的未被訪問的頂點&#xff0c;并將其加入到生成樹中&#xff0c;直到所有頂點都被加入到生成樹中為止。 具體來說…

部署你的第一個應用

&#x1f5d3;?實驗環境 OS名稱Microsoft Windows 11 家庭中文版系統類型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f913;FastAPI 構建應用 #基于fastapi快速創建一個項目 rkun1LAPTOP-TUS5FU0D MINGW64 / $ mkdir k8s-appr…

1688 API接口測試指南

本文為您提供1688 API接口的測試指南。我們將介紹1688 API的基本概念&#xff0c;詳解測試步驟&#xff0c;并為您提供一系列的最佳實踐&#xff0c;以確保您在與1688平臺進行API交互時能夠獲得最佳的效果和穩定性。 一、了解1688 API 1688 API是1688平臺為開發者提供的一套用…

數學建模之擬合及其代碼

發現新天地&#xff0c;歡迎訪問Cr不是鉻的個人網站 引言 與插值問題不同&#xff0c;在擬合問題中不需要曲線一定經過給定的點。擬合問題的目標是尋求一個函數&#xff08;曲線&#xff09;&#xff0c;使得該曲線在某種準則下與所有的數據點最為接近&#xff0c;即曲線擬合…

基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼

基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于跳蛛優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神經網絡的光滑…

7_畫圖常用代碼

plt.figure(dpi200) # 設置 dpi 為 200&#xff08;可以根據需要調整這個值&#xff09;

數據結構學習筆記——多維數組、矩陣與廣義表

目錄 一、多維數組&#xff08;一&#xff09;數組的定義&#xff08;二&#xff09;二維數組&#xff08;三&#xff09;多維數組的存儲&#xff08;四&#xff09;多維數組的下標的相關計算 二、矩陣&#xff08;一&#xff09;特殊矩陣和稀疏矩陣&#xff08;二&#xff09;…

從權限跳轉看Activity的data android:scheme

在應用申請懸浮窗權限的時候&#xff0c;可以跳轉到相應的設置界面&#xff0c;并且自動切換到應用的條目&#xff0c;高亮顯示一下&#xff0c; android懸浮窗權限怎么申請 在Android中&#xff0c;要申請懸浮窗權限&#xff0c;需要以下步驟&#xff1a; 在 AndroidManifes…

hp惠普Victus Gaming Laptop 15-fa1025TX/fa1005tx原裝出廠Win11系統ISO鏡像

光影精靈9筆記本電腦原廠W11系統22H2恢復出廠時開箱狀態一模一樣 適用型號&#xff1a;15-fa1003TX&#xff0c;15-fa1005TX&#xff0c;15-fa1007TX&#xff0c;15-fa1025TX 鏈接&#xff1a;https://pan.baidu.com/s/1fBPjed1bhOS_crGIo2tP1w?pwduzvz 提取碼&#xff1a…

每天一道算法題(十一)——滑動窗口最大值_困難(中等)

文章目錄 1、問題2、示例3、解決方法&#xff08;1&#xff09;方法1——雙指針 總結 1、問題 給你一個整數數組 nums&#xff0c;有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回 滑動窗…

c++ 函數的申明

1 一個cpp中 兩種情況 1.1 定義 使用 1.2 聲明 使用 定義 2 按 定義 后 直接使用的順序 不用 聲明 函數 #include <iostream> using namespace std;int max(int a, int b) {int max a>b?a:b;return max; }int main() {int a 1;int b 2;cout << max(a, b…

解決vue中引入天地圖顯示不全問題,設置setTimeout即可解決!

index.html中引入天地圖api <script type"text/javascript" src"https://api.tianditu.gov.cn/api?v4.0&tk你的key"></script>map.vue中初始化天地圖 //初始化天地圖 initTMap() {const T window.T;// 3.初始化地圖對象this.tMap new…

flink1.13.6版本的應用程序(maven版)

問題 想要一個指定flink版本的java計算任務hello world最簡工程。 解決 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.13.6這里直接使用官方mave模版工程&#xff0c;指…

系統架構設計:13 論基于構件的軟件開發

論基于構件的軟件開發 軟件系統的復雜性不斷增長、軟件人員的頻繁流動和軟件行業的激烈竟爭迫使軟件企業提高軟件質量、積累和固化知識財富,并盡可能地縮短軟件產品的開發周期。 集軟件復用、分布式對象計算、企業級應用開發等技術為一體的“基于構件的軟件開發”應運而生,…

LeetCode 2304. 網格中的最小路徑代價:DP

【LetMeFly】2304.網格中的最小路徑代價&#xff1a;DP 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/minimum-path-cost-in-a-grid/ 給你一個下標從 0 開始的整數矩陣 grid &#xff0c;矩陣大小為 m x n &#xff0c;由從 0 到 m * n - 1 的不同整數組成。你可以…

【python基礎(二)】列表詳解

文章目錄 一. 訪問列表元素二. 使用列表中的各個值三. 修改、添加和刪除元素1. 修改列表元素2. 在列表中添加元素3. 從列表中刪除元素 四.組織列表1. sort()對列表永久排序2. sorted()對列表臨時排序3. 倒著打印列表4. 確定列表的長度 列表由一系列按特定順序排列的元素組成。可…

Django框架之Cookie和Session和CBV加裝飾器的三種方法

【一】Cookie與Session Cookie和Session是用來在Web應用程序中跟蹤用戶會話數據的兩種常用技術。 【1】Cookie和Session的發展史 【1】Cookie的發展史&#xff1a; 1994年&#xff0c;網景通信公司推出了第一個瀏覽器Cookie技術。Cookie是存儲在用戶計算機上的小型文本文件…