【C語言實現:用隊列模擬棧與用棧模擬隊列(LeetCode 225 232)】

在這里插入圖片描述

LeetCode刷題記錄
  • 🌐 我的博客主頁:iiiiiankor
  • 🎯 如果你覺得我的內容對你有幫助,不妨點個贊👍、留個評論?,或者收藏?,讓我們一起進步!
  • 📝 專欄系列:LeetCode 刷題日志
  • 🌱 文章內容來自我的學習與實踐經驗,如果你有任何想法或問題,歡迎隨時在評論區交流討論。讓我們一起探索更多的可能!🚀

💚文章目錄💚

  • ?前言?
  • ??注意??
  • 🚀LeetCode225.用隊列實現棧
    • 一、🌟題目描述🌟
    • 二、🎨分析🎨
    • 三、💥題解💥
      • 棧"的結構定義
      • Push接口
      • Pop接口
      • 獲取棧頂元素
      • 判斷棧是否為空
      • 釋放free
      • ??總代碼??
  • 🚀LeetCode232.用棧實現隊列
    • 一、🌟題目描述🌟
    • 二、🎨分析🎨
    • 三、💥題解💥
      • 模擬隊列的結構
      • 初始化隊列
      • Push
      • Pop
      • 獲取隊頭元素
      • 判斷是不是空
      • 釋放
      • ??總代碼??

?前言?

首先我們可以先復習一下相關性質:

棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底
棧中的數據元素遵守后進先出LIFO(Last In First Out)的原則。
壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。
出棧:棧的刪除操作叫做出棧。出數據也在棧頂

實現方法:1. 數組(順序表) 2.鏈表
在這里插入圖片描述

  • 隊列

隊列:只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出FIFO(First In First Out)
入隊列:進行插入操作的一端稱為隊尾
出隊列:進行刪除操作的一端稱為隊頭
實現:1.鏈表(更優)2.數組(較差)

在這里插入圖片描述

??注意??

C語言中并不想C++或者Java等高級語言那樣,庫中有封裝好的棧和隊列
所以我們用C做這些題的時候,都必須先把棧或者隊列寫出來,才能做題!
這也是用C刷題的很惡心的地方
但是 也能鞏固我們的知識不是嘛?

🚀LeetCode225.用隊列實現棧

鏈接:LeetCode225.用隊列實現棧

一、🌟題目描述🌟

在這里插入圖片描述

二、🎨分析🎨

我們知道,隊列是先進先出,而棧是后進先出,那么怎么用隊列實現棧呢?
我們通過畫圖來分析:

如果給你一個不為空的隊列,我們叫他noempty
在這里插入圖片描述
這個隊列是 按照 1 2 3 4 的順序放入的數據
所以 如果是隊列的話 那么出隊列的順序也是 1 2 3 4
但是如果想要實現棧,那么第一個出去的數據應該是4
我們怎么實現呢?
如果我們還有一個空的隊列,我們叫他empty
我們把1 2 3 放到empty里面,那么noempty里就只剩下了 4,如圖:
在這里插入圖片描述
這樣,noempty的隊頭就是4 我們直接對noempty進行pop
然后 隊列的性質是先進先出,所以在empty中也是 原來的1 2 3順序
empty出隊列的順序也是1 2 3
所以 我們只需要把empty中的元素再倒回noempty
我們再觀察noempty,是不是就完成了棧的后進先出的性質!!!
(因為 4 是最后進入的)
在這里插入圖片描述
綜上所述,其實empty就是用來倒數據的!
因此我們要時刻保證一個是空隊列,另一個是非空隊列
這道題目實際上就是利用一個空隊列和隊列的相關性質,來實現棧的 后進先出的!

三、💥題解💥

棧"的結構定義

這里的“棧” 是我們目標實現的那個棧
  • 結構需要包含兩個隊列

    注意: 此類型題目的結構比較復雜
    因為我們使用鏈表實現的棧,所以“棧”中包含的隊列的結構中還有

  • 鏈表頭節點

  • 鏈表尾節點

“棧”的結構

//這里是匿名結構體 因為有typedef 后面可以使用匿名結構體
typedef struct {//結構中包含兩個隊列Queue q1;Queue q2;
} MyStack;

隊列的結構:

typedef struct Queue {size_t size;//利用一個變量去標識隊列的大小QNode* head;//隊列的頭節點QNode* tail;//隊列的尾節點
}Queue;

Push接口

由于我們需要保持一個隊列為空,另一個隊列不為空
對于push接口,我們只需要判斷哪一個隊列不為空
然后向該隊列push數據就可以了

Pop接口

如果要pop數據,如1 2 3 4 5
模擬實現棧,所以要出棧,也就是刪除棧頂
而棧頂就是隊列的隊尾
所以要刪除5
只需要把前面一個個數據挪動到空隊列
直接讓5出隊就可以了

注意這里題目讓你返回pop掉的元素!

獲取棧頂元素

顯示棧頂元素
只需要找到不為空的隊列就可以了
這里我們不需要考慮如果兩個隊列都為空了怎么辦
只要完成他給的接口就可以了!
測試用例一定是正確合理的! 不會出現空了還讓你調用這個函數的情況
: 測試用例就是看你邏輯正不正確!

判斷棧是否為空

因為我們的棧是用兩個隊列來實現的
所以 如果兩個隊列都為空,那么說明棧為空!

釋放free

  1. 首先把結構中包含的兩個隊列釋放掉
  2. 然后把該結構釋放掉

??總代碼??

// 用隊列實現棧typedef int QDataType;
//定義隊列節點的結構  
typedef struct QueueNode {struct QueueNode* next;QDataType val;//隊列中的數據
}QNode;//利用封裝一個結構
typedef struct Queue {size_t size;//利用一個變量去標識隊列的大小QNode* head;//隊列的頭節點QNode* tail;//隊列的尾節點
}Queue;//初始化
void QueueInit(Queue* pq);
//入隊列
void QueuePush(Queue* pq, QDataType x);
//出隊列
void QueuePop(Queue* pq);
//獲取隊頭元素
QDataType QueueFront(Queue* pq);
//獲取隊尾元素
QDataType QueueBack(Queue* pq);
//獲取隊列中元素個數
int QueueSize(Queue* pq);
//檢測隊列是否為空
bool QueueEmpty(Queue* pq);
//銷毀隊列
void QueueDestory(Queue* pq);//初始化
void QueueInit(Queue* pq)
{assert(pq);//頭節點和尾節點都設置為空即可pq->head = pq->tail = NULL;pq->size = 0;}
//入隊列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){printf("malloc fail!");exit(-1);}newnode->next = NULL;newnode->val = x;//如果隊列為空if (pq->tail == NULL)//也可以使用head==NULL{pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;//更新尾部}pq->size++;
}
//出隊列
void QueuePop(Queue* pq)
{assert(pq);//如果只有一個節點if (pq->head->next == NULL)//這里需要用head的next{free(pq->head);pq->head = pq->tail = NULL;pq->size--;//隊列元素個數減一}else{QNode* next = pq->head->next;free(pq->head);pq->head = next;pq->size--;}
}
//獲取隊頭元素
QDataType QueueFront(Queue* pq)
{assert(pq);//如果隊列為空 無法獲取!assert(!QueueEmpty(pq));return pq->head->val;
}
//獲取隊尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->val;
}
//獲取隊列中元素個數
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
//檢測隊列是否為空
bool QueueEmpty(Queue* pq)
{assert(pq);//如果 head為空 返回真 否則返回假return pq->head == NULL;
}
//銷毀隊列
void QueueDestory(Queue* pq)
{assert(pq);//只需要逐個釋放就可以了QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}/*****************************************/
/*  題解代碼   */
typedef struct {//結構中包含兩個隊列Queue q1;Queue q2;
} MyStack;//初始化
MyStack* myStackCreate() {//首先需要開辟一個stackMyStack* obj = (MyStack*)malloc(sizeof(MyStack));//然后對開辟的Mystack中的q1和q2初始化QueueInit(&obj->q1);QueueInit(&obj->q2);//然后需要返回objreturn obj;
}void myStackPush(MyStack* obj, int x) {//如果q1不為空 那么就向q1里面插入數據if (!QueueEmpty(&obj->q1)){QueuePush(&obj->q1, x);}else//否則就向q2里面插入數據{QueuePush(&obj->q2, x);}
}int myStackPop(MyStack* obj) {//首先需要判斷哪一個不為空//先假設q1為空 q2不為空Queue* empty = &obj->q1;Queue* noempty = &obj->q2;//如果假設錯了 就改一下if (!QueueEmpty(&obj->q1)){empty = &obj->q2;noempty = &obj->q1;}//然后就把非空隊列的數據導入到空隊列 知道非空隊列還有一個數據while (QueueSize(noempty) > 1){//把非空隊列的隊頭 push到空隊列QueuePush(empty, QueueFront(noempty));QueuePop(noempty);}//因為對于棧頂元素需要返回和刪除//所以先把棧頂元素記錄一下啊int top = QueueFront(noempty);QueuePop(noempty);return top;
}int myStackTop(MyStack* obj) {//既然是顯示棧頂元素//那就需要找到非空隊列//顯示非空隊列的隊尾就可以了//如果隊列q1不為空if (!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {//如果兩個隊列都是空的 那么棧就是空return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {//1. 釋放Mystackj里面包含的q1 和 q2 (他們里面也有malloc的節點)//2. 釋放 MystackQueueDestory(&obj->q1);QueueDestory(&obj->q2);free(obj);
}

🚀LeetCode232.用棧實現隊列

鏈接:LeetCode232.用棧實現隊列

一、🌟題目描述🌟

在這里插入圖片描述

二、🎨分析🎨

思考:
這個題會不會和上一道題很類似?
我們知道 棧的性質是 后進先出,而隊列的性質是先進先出
那么怎么讓最先進去的最先出來呢?
畫圖分一下:
在這里插入圖片描述

顯然 最先入棧的是:1,那么如何讓1 先出棧呢?
那么我們是不是可以這樣?
把左邊的棧的元素全部push到右邊的空棧,因為棧是從棧頂出棧
所以 入右邊的棧的順序是4-3-2-1
變成了這樣:
在這里插入圖片描述
這時候,如果想溢出1,只需要pop一下右邊的棧就可以了!
然后,我們是不是還要把 剩下的元素倒回原來的左邊的棧呢?
注意,這里和上面那個題不一樣的地方就在這里!
如果我們把右邊的棧的數據倒回左邊的棧,變成這樣:
在這里插入圖片描述
這時候如果再出棧,是不是還要重復把左邊的棧的數據 重新push到右邊的棧?
這無疑增加了工作量!
由于棧有著后進先出的特殊性質,所以 我們只要把左邊的棧的數據push到右邊的棧,右邊的棧中就可以不斷的pop(因為此時元素的順序已經顛倒了!,符合先進先出了)
所以,導入到右邊的棧之后,不需要再回來了!!!
然后 怎么push呢?,我們直接向左邊的棧中push就可以了!!
也就是說:左邊的棧用來push,我們叫做pushst,右邊的棧用來pop,我們叫做popst
如果,popst已經空了,那么再把pushst里面的數據push到popst 就可以了!

總結:

	- 棧的性質和隊列不一樣,因為隊列是先進先出
所以把一個數據從一個隊列push到另一個隊列之后,原來的元素順序不會發生改變
所以需要在倒回來- 而棧的性質不一樣,棧是后進先出
所以把`pushst`里的數據導入到`popst`之后,數據的順序發生顛倒
所以,由于已經顛倒過來,把`popst`里的數據進行pop,就相當于隊列的出隊!
而不需要再倒回`pushst`的原因是因為: 這時候的`popst`里的數據順序恰好是出隊順序
而如果重新導入`pushst`,那么再pop數據的時候,還需要把數據先push到`popst`中- 這樣,如果我們想push數據,直接push到`pushst`中,
當`popst`空的時候,把`pushst`中數據導入到`popst`中,從而實現繼續出隊!

也就是說: pushst控制入隊,popst控制出隊

這個結構就相當于
在這里插入圖片描述

三、💥題解💥

模擬隊列的結構

包含兩個棧

//匿名結構體的使用 可以利用typedef!
typedef struct {ST pushst;ST popst;
} MyQueue;

初始化隊列

首先malloc一個 ‘隊列’
然后要初始化 隊列中的兩個棧
pushst用來push
popst用來pop

MyQueue* myQueueCreate() {MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));//初始化兩個棧StackInit(&obj->pushst);StackInit(&obj->popst);return obj;
}

Push

這樣其實 push就很簡單了
只需要向棧pushst里直接push就可以了!

void myQueuePush(MyQueue* obj, int x) {//入隊統一在push棧中入數據StackPush(&obj->pushst,x);
}

Pop

pop比較麻煩,但也很簡單
因為我們首先判斷popst是不是為空
如果為空,那么pushst中的數據push到popst
否則直接poppopst

int myQueuePop(MyQueue* obj) {//出棧 是對pop進行的//如果popst為空 那么首先把pushst里的數據導入到popstif(StackEmpty(&obj->popst)){while(!StackEmpty(&obj->pushst)){StackPush(&obj->popst,StackTop(&obj->pushst));StackPop(&obj->pushst);}}//需要記錄隊尾 并返回int qtail=StackTop(&obj->popst);//出隊StackPop(&obj->popst);//返回隊尾元素return qtail;}

獲取隊頭元素

由于popst的棧頂就相當于隊頭,所以直接返回popst的棧頂就可以了!
注意:需要判斷一下popst是不是為空!
如果為空 需要把pushst中的數據 先 push到popst

int myQueuePeek(MyQueue* obj) {//隊列的頭相當于 popst的棧頂//首先判斷是不是空 如果是空 導入到popstif(StackEmpty(&obj->popst)){while(!StackEmpty(&obj->pushst)){StackPush(&obj->popst,StackTop(&obj->pushst));StackPop(&obj->pushst);}}return StackTop(&obj->popst);
}

判斷是不是空

顯然如果兩個棧都為空 說明隊列為空

bool myQueueEmpty(MyQueue* obj) {//什么時候為空呢?//顯然 如果兩個棧都為空 說明隊列為空return StackEmpty(&obj->pushst) && StackEmpty(&obj->popst);
}

釋放

  1. 首先釋放兩棧
  2. 然后釋放隊列結構
void myQueueFree(MyQueue* obj) {//首先釋放兩個棧//然后釋放MyQueueStackDestory(&obj->pushst);StackDestory(&obj->popst);free(obj);
}

??總代碼??

typedef int STDataType;
typedef struct Stack {//動態開辟數組STDataType* a;int top;//棧頂int capacity;//容量
}ST;
//初始化
void StackInit(ST* ps);
//壓棧
void StackPush(ST* ps, STDataType x);
//出棧
void StackPop(ST* ps);
//獲取棧中有效元素個數
int StackSize(ST* ps);
//顯示棧頂元素
STDataType StackTop(ST* ps);
//檢測棧是否為空
bool StackEmpty(ST* ps);
//銷毀
void StackDestory(ST* ps);//初始化
void StackInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->top = 0;
}
//壓棧
void StackPush(ST* ps, STDataType x)
{assert(ps);//首先檢查是不是需要擴容if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * newCapacity);if (tmp == NULL){printf("realloc fail");exit(-1);}ps->capacity = newCapacity;ps->a = tmp;}ps->a[ps->top] = x;ps->top++;
}
//出棧
void StackPop(ST* ps)
{assert(ps);//有元素才能出棧assert(ps->top > 0);//只需要ps--就可以了ps->top--;}
//獲取棧中有效元素個數
int StackSize(ST* ps)
{assert(ps);return ps->top;
}
//獲取棧頂元素
STDataType StackTop(ST* ps)
{assert(ps);return ps->a[ps->top-1];
}
//檢測棧是否為空
bool StackEmpty(ST* ps)
{				assert(ps);return ps->top == 0;
}
//銷毀
void StackDestory(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;//ps->a 不用了 所以置空就可以了ps->capacity = ps->top = 0;
}//匿名結構體的使用 可以利用typedef!
typedef struct {ST pushst;ST popst;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));//初始化兩個棧StackInit(&obj->pushst);StackInit(&obj->popst);return obj;
}void myQueuePush(MyQueue* obj, int x) {//入隊統一在push棧中入數據StackPush(&obj->pushst,x);
}int myQueuePop(MyQueue* obj) {//出棧 是對pop進行的//如果popst為空 那么首先把pushst里的數據導入到popstif(StackEmpty(&obj->popst)){while(!StackEmpty(&obj->pushst)){StackPush(&obj->popst,StackTop(&obj->pushst));StackPop(&obj->pushst);}}//需要記錄隊尾 并返回int qtail=StackTop(&obj->popst);//出隊StackPop(&obj->popst);//返回隊尾元素return qtail;}int myQueuePeek(MyQueue* obj) {//隊列的頭相當于 popst的棧頂//首先判斷是不是空 如果是空 導入到popstif(StackEmpty(&obj->popst)){while(!StackEmpty(&obj->pushst)){StackPush(&obj->popst,StackTop(&obj->pushst));StackPop(&obj->pushst);}}return StackTop(&obj->popst);
}bool myQueueEmpty(MyQueue* obj) {//什么時候為空呢?//顯然 如果兩個棧都為空 說明隊列為空return StackEmpty(&obj->pushst) && StackEmpty(&obj->popst);
}void myQueueFree(MyQueue* obj) {//首先釋放兩個棧//然后釋放MyQueueStackDestory(&obj->pushst);StackDestory(&obj->popst);free(obj);
}/*** 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);
*/

?感謝閱讀~ ?
??碼字不易,給個贊吧~??

在這里插入圖片描述

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

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

相關文章

【Python】Selenium 爬蟲的使用技巧和案例

引言 Selenium 是 Python 中功能強大的自動化測試工具,因其能夠操控瀏覽器進行模擬操作,被廣泛應用于網頁數據爬取。相比傳統的 requests 等庫,Selenium 能更好地應對動態加載內容和復雜交互場景。本文將詳細介紹 Selenium 爬蟲的使用技巧,并提供實際案例來幫助讀者快速上…

MySQL SQL語句性能優化

MySQL SQL語句性能優化指南 一、查詢設計優化1. 避免 SELECT *2. 使用 WHERE 進行條件過濾3. 避免在索引列上使用函數和表達式4. 使用 LIMIT 限制返回行數5. 避免使用子查詢6. 優化 JOIN 操作7. 避免全表掃描 二、索引優化1. 使用合適的索引2. 覆蓋索引3. 索引選擇性4. 多列索引…

Mybatis動態sql執行過程

動態SQL的執行原理主要涉及到在運行時根據條件動態地生成SQL語句,然后將其發送給數據庫執行。以下是動態SQL執行原理的詳細解釋: 一、接收參數 動態SQL首先會根據用戶的輸入或系統的條件接收參數。這些參數可以是查詢條件、更新數據等,它們…

java jar包加密 jar-protect

介紹 java 本身是開放性極強的語言,代碼也容易被反編譯,沒有語言層面的一些常規保護機制,jar包很容易被反編譯和破解。 受classfinal(已停止維護)設計啟發,針對springboot日常項目開發,重新編寫安全可靠的jar包加殼加密技術,用于保護軟件版權。 使用說…

Linux:Git

Git常見指令: git help xx_command git xx_command --help git --version 查看git版本git config --global user.name "xxx_name" 全局級別的簽名設置,全局的放在本用 git config --global user.ema…

【WiFi】WiFi中RSSI、SNR、NF之間關系及說明

RSSI(接收信號強度指示) 定義: RSSI 是一個相對值,用于表示接收到的無線信號的強度。它通常由無線設備的硬件(如無線網卡或無線芯片)直接提供。 計算: RSSI 的計算通常是由設備的無線芯片完成的…

提升音頻轉錄準確性:VAD技術的應用與挑戰

引言 在音頻轉錄技術飛速發展的今天,我們面臨著一個普遍問題:在嘈雜環境中,轉錄系統常常將非人聲誤識別為人聲,導致轉錄結果出現錯誤。例如,在whisper模式下,系統可能會錯誤地轉錄出“謝謝大家”。本文將探…

[ZMQ] -- ZMQ通信Protobuf數據結構 1

1、前言背景 工作需要域間實現zmq通信,剛開始需要比較簡單的數據結構,比如兩個bool,后面可能就需要傳輸比較大的數據,所以記錄下實現流程,至于為啥選擇proto數據結構去做大數據傳輸,可能是地平線也用這個&…

順序表的使用,對數據的增刪改查

主函數: 3.c #include "3.h"//頭文件調用 SqlListptr sql_cerate()//創建順序表函數 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆區申請連續的空間if(NULLptr){printf("創建失敗\n");return NULL;//如果沒有申請成功&#xff…

React和Vue中暴露子組件的屬性和方法給父組件用,并且控制子組件暴露的顆粒度的做法

React 在 React 中,forwardRef 是一種高級技術,它允許你將 ref 從父組件傳遞到子組件,從而直接訪問子組件的 DOM 節點或公開的方法。這對于需要操作子組件內部狀態或 DOM 的場景非常有用。為了使子組件能夠暴露其屬性和方法給父組件&#xf…

《C++ 實時視頻流物體跟蹤與行為分析全解析》

在當今科技飛速發展的時代,視頻監控與智能分析技術在眾多領域發揮著極為重要的作用。從安防監控到智能交通,從工業自動化到人機交互,利用 C 處理實時視頻流中的物體跟蹤和行為分析成為了熱門且極具挑戰性的研究與開發方向。本文將深入探討其中…

5G中的隨機接入過程可以不用收RAR?

有朋友提到了一種不用接收RAR的RA過程,問這個是怎么回事。其實在剛剛寫過的LTM cell switch篇章中就有提到,這里把所有相關的內容整理如下。 在RACH-less LTM場景,在進行LTM cell switch之前就要先知道target cell的TA信息,進而才…

git 導出某段時間修改的文件 windows

第一步:列出兩次commitID之間的文件變動 git diff oldid newid --name-only// 例如 git diff 4a886c57a8b5611a2abcfcd120461c2e92f7029a HEAD --name-only 4a886c57a8b5611a2abcfcd120461c2e92f7029a 代表之前 HEAD 代表最新或者換成某次commitID 例如&#xf…

Qt 聯合Halcon配置

文章目錄 配置代碼窗口綁定 配置 選擇添加庫 選擇外部庫 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…

new URL(`../assets/images/${name}`, import.meta.url).href

背景: 文章講述了Vite框架中關于資源文件(如圖片)在默認配置下,如何正確處理開發環境和打包后的不同引用方式。重點介紹了使用import.meta.url和new URL() 來動態獲取并處理靜態資源URL的方法,以及注意事項&#xff0…

8、筆記本品牌分類介紹:LG - 計算機硬件品牌系列文章

LG筆記本品牌以其高性能和先進技術而聞名,?提供多種型號以滿足不同用戶的需求。? LG筆記本產品線包括多種類型,?以滿足不同用戶的需求。?其中,?LG Gram Pro系列以其超薄設計和高性能配置受到關注。?該系列筆記本采用16:10的OLED顯示屏&…

367_C++_計算mouse移動過程中,視頻框的右側、底部邊距,以及根據實時的右側、底部邊距計算—視頻框的左上角位置

代碼分析 1. restorePos 方法 restorePos 的作用是恢復 NavigationFrame 的位置,將其移動到父窗口或者指定矩形內的特定位置。 void NavigationFrame::restorePos() {// 獲取目標矩形:優先使用 `m_pRect`,否則默認使用視頻區域或父窗口區域RSRect videoRect(m_pVide

Tiptap,: 富文本編輯器入門與案例分析

Tiptap 是一個現代的富文本編輯器,基于 ProseMirror 打造,旨在提供一個靈活且功能強大的文本編輯解決方案。它具有開箱即用的能力,同時也允許開發者根據業務需求進行高度定制化擴展。與傳統的富文本編輯器相比,Tiptap 提供了更精細…

scala的泛型類

泛型:類型參數化 泛型類指的是把泛型定義到類的聲明上, 即:該類中的成員的參數類型是由泛型來決定的. 在創建對象時, 明確具體的數據類型. 定義格式: class 類名(成員名:數據類型) class 類名[泛型名](成員名:泛型名) 參考代…

對比損失(Contrastive Loss)與大模型:Contrastive Loss and Large Models (中英雙語)

對比損失(Contrastive Loss)與大模型:從原理到實踐 在現代深度學習中,對比損失(Contrastive Loss)是一種核心技術,尤其是在對比學習(Contrastive Learning)中被廣泛使用…