【數據結構】隊列和棧練習

1.用隊列實現棧?

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

typedef int QDatatype;
typedef struct QueueNode
{struct QueueNode *next;QDatatype data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;QDatatype size;
}Que;typedef struct 
{Que q1;Que q2;
} MyStack;void QueueInit(Que* pq);
void QueueDestroy(Que* pq);void QueuePush(Que* pq, QDatatype x);
void QueuePop(Que* pq);
int QueueSize(Que* pq);
bool QueueEmpty(Que* pq);QDatatype QueueFront(Que* pq);//隊頭數據
QDatatype QueueBack(Que* pq);//隊尾數據void QueueInit(Que* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}void QueueDestroy(Que* 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;
}void QueuePush(Que* pq, QDatatype x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode==NULL){perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;if (pq->head == NULL){assert(pq->tail == NULL);pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}void QueuePop(Que* pq)
{assert(pq);assert(pq->head != NULL);QNode* oldhead = pq->head;pq->head = pq->head->next;free(oldhead);if (pq->head == NULL){pq->tail = NULL;}pq->size--;
}int QueueSize(Que* pq)
{assert(pq);return pq->size;
}bool QueueEmpty(Que* pq)
{assert(pq);return pq->size == 0;
}QDatatype QueueFront(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}QDatatype QueueBack(Que* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}MyStack* myStackCreate() 
{MyStack*pst=(MyStack*)malloc(sizeof(MyStack));if(pst==NULL){perror("malloc fail");return NULL;}QueueInit(&pst->q1);QueueInit(&pst->q2);return pst;
}void myStackPush(MyStack* obj, int x) 
{if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1,x);}else{QueuePush(&obj->q2,x);}
}int myStackPop(MyStack* obj) 
{assert(obj != NULL);Que* emptyQ = NULL;Que* noneemptyQ = NULL;// 確定哪個隊列是非空的if (!QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2)) {noneemptyQ = &obj->q1;emptyQ = &obj->q2;} else if (QueueEmpty(&obj->q1) && !QueueEmpty(&obj->q2)) {noneemptyQ = &obj->q2;emptyQ = &obj->q1;} else {// 兩個隊列都為空,棧為空return -1; }// 將非空隊列的元素(除最后一個外)移到空隊列while (QueueSize(noneemptyQ) > 1) {QueuePush(emptyQ, QueueFront(noneemptyQ));QueuePop(noneemptyQ);}// 最后一個元素是棧頂int top = QueueFront(noneemptyQ);QueuePop(noneemptyQ);return top;
}int myStackTop(MyStack* obj) 
{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) 
{QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

2.用棧實現隊列?

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

typedef int STDataType;typedef struct Stack
{int* a;int top;int capacity;
}ST;typedef struct
{ST Popst;ST Pushst;
} MyQueue;void STInit(ST* ps);
void STDestroy(ST* ps);void STPush(ST* ps,STDataType x);
void STPop(ST* ps);
int STSize(ST* ps);
bool STEmpty(ST* ps);STDataType STTop(ST* ps);void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL){perror("malloc fail");return;}ps->capacity = 4;ps->top = 0;//top是棧頂元素的下一位置}void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->capacity = 0;ps->top = 0;
}void STPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){STDataType*tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity*2);if (tmp == NULL){perror("malloc fail");return;}ps->a = tmp;ps->capacity *= 2;}ps->a[ps->top] = x;ps->top++;
}void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}int STSize(ST* ps)
{assert(ps);return ps->top;
}
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}STDataType STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];
}MyQueue* myQueueCreate() 
{MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));if(obj==NULL){perror("malloc fail");return NULL;}STInit(&obj->Pushst);STInit(&obj->Popst);return obj;
}void myQueuePush(MyQueue* obj, int x) 
{STPush(&obj->Pushst,x);
}int myQueuePeek(MyQueue* obj) 
{if(STEmpty(&obj->Popst)){while(!STEmpty(&obj->Pushst)){STPush(&obj->Popst,STTop(&obj->Pushst));STPop(&obj->Pushst);}}return STTop(&obj->Popst);
}int myQueuePop(MyQueue* obj) 
{int front=myQueuePeek(obj);STPop(&obj->Popst);return front;
}bool myQueueEmpty(MyQueue* obj) 
{return(STEmpty(&obj->Pushst)&&STEmpty(&obj->Popst));
}void myQueueFree(MyQueue* obj) 
{STDestroy(&obj->Pushst);STDestroy(&obj->Popst);free(obj);
}

3.設計循環隊列

622. 設計循環隊列 - 力扣(LeetCode)

typedef struct {int*a;int k;int front;int rear;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue*obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->front=obj->rear=0;obj->a=(int*)malloc(sizeof(int)*(k+1));obj->k=k;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->front==obj->rear;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->rear+1)%(obj->k+1)==obj->front;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;obj->a[obj->rear++]=value;obj->rear%=(obj->k+1);return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;++obj->front;obj->front%=(obj->k+1);return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->rear-1+obj->k+1)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

?

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

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

相關文章

LabVIEW二維碼實時識別

?LabVIEW通過機器視覺技術,集成適配硬件構建二維碼實時識別系統。通過圖像采集、預處理、定位及識別全流程自動化,解決復雜環境下二維碼識別效率低、準確率不足問題,滿足工業產線追溯、物流分揀等實時識別需求。應用場景適用于工業產線追溯&…

微服務-springcloud-springboot-Skywalking詳解(下載安裝)

一、SkyWalking核心介紹 1. 什么是SkyWalking? Apache SkyWalking是一款國人主導開發的開源APM(應用性能管理)系統,2015年由吳晟創建,2017年進入Apache孵化器,2019年畢業成為Apache頂級項目。它通過分布式…

Elasticsearch 字段值過長導致索引報錯問題排查與解決經驗總結

在最近使用 Elasticsearch 的過程中,我遇到了一個 字段值過長導致索引失敗 的問題。經過排查和多次嘗試,最終通過設置字段 "index": false 方式解決。本文將從問題現象、排查過程、問題分析、解決方案和建議等方面,詳細記錄這次踩坑…

使用idea 將一個git分支的部分記錄合并到git另一個分支

場景: 有多個版本分支,需要將其中一個分支的某一兩次提交合并到指定分支上 eg: 將v1.0.0分支中指定提交記錄 合并到 v1.0.1分支中 操作: 步驟一 idea切換項目分支到v1.0.1(需要合并到哪個分支就先站到哪個分支上) 步驟二 在ide…

基于深度學習的圖像分類:使用ShuffleNet實現高效分類

前言 圖像分類是計算機視覺領域中的一個基礎任務,其目標是將輸入的圖像分配到預定義的類別中。近年來,深度學習技術,尤其是卷積神經網絡(CNN),在圖像分類任務中取得了顯著的進展。ShuffleNet是一種輕量級的…

OpenGL里相機的運動控制

相機的核心構造一個是glm::lookAt函數,一個是glm::perspective函數,本文相機的一切運動都在于如何構建相應的參數傳入上述兩個函數里。glm::mat4 glm::lookAt(glm::vec3 const &eye,//相機所在位置glm::vec3 const &center,//要凝視的點glm::vec…

java設計模式 -【策略模式】

策略模式定義 策略模式(Strategy Pattern)是一種行為設計模式,允許在運行時選擇算法的行為。它將算法封裝成獨立的類,使得它們可以相互替換,而不影響客戶端代碼。 核心組成 Context(上下文)&…

項目重新發布更新緩存問題,Nginx清除緩存更新網頁

server {listen 80;server_name your.domain.com; # 替換為你的域名root /usr/share/nginx/html; # 替換為你的項目根目錄# 規則1:HTML 文件 - 永不緩存# 這是最關鍵的一步,確保瀏覽器總是獲取最新的入口文件。location /index.html {add_header Cache-…

系統架構師:系統安全與分析-思維導圖

系統安全與分析的定義??系統安全與分析是系統架構師在系統全生命周期中貫穿的核心職責,其本質是通過??識別、評估、防控安全風險,并基于數據與威脅情報進行動態分析??,構建從技術到管理的多層次防護體系,確保系統的保密性&a…

利用 Google Guava 的令牌桶限流實現數據處理限流控制

目錄 一、令牌桶限流機制原理 二、場景設計與目標 三、核心實現代碼(Java) 1. 完整代碼實現 四、運行效果分析 五、應用建議 在高吞吐數據處理場景中,如何限制數據處理速率、保護系統資源、防止下游服務過載是系統設計中重要的環節。本文…

小黑課堂計算機二級 WPS Office題庫安裝包2.52_Win中文_計算機二級考試_安裝教程

軟件下載 【名稱】:小黑課堂計算機二級 WPS Office題庫安裝包2.52 【大小】:584M 【語言】:簡體中文 【安裝環境】:Win10/Win11(其他系統不清楚) 【迅雷網盤下載鏈接】(務必手機注冊&#…

CSS3知識補充

1.偽類和偽元素: 簡單的偽類實例 :first-chlid :last-child :only-child :invalid 用戶行為偽類 :hover——上面提到過,只會在用戶將指針挪到元素上的時候才會激活,一般就是鏈接元素。:focus——只會在用戶使用鍵盤控制,選…

Spring Retry 異常重試機制:從入門到生產實踐

Spring Retry 異常重試機制&#xff1a;從入門到生產實踐 適用版本&#xff1a;Spring Boot 3.x spring-retry 2.x 本文覆蓋 注解聲明式、RetryTemplate 編程式、監聽器、最佳實踐 與 避坑清單&#xff0c;可直接落地生產。 一、核心坐標 <!-- Spring Boot Starter 已經幫…

VTK交互——CallData

0. 概要 這段代碼https://examples.vtk.org/site/Cxx/Interaction/CallData/是一個使用VTK(Visualization Toolkit)庫的示例程序,主要演示了自定義事件、回調函數和定時器的使用。程序創建一個旋轉球體場景,并通過定時器觸發自定義事件來更新計數器。以下是詳細解釋: 1.…

OCR工具集下載與保姆級安裝教程!!

軟件下載 軟件名稱&#xff1a;OCR工具集1.1 軟件語言&#xff1a;簡體中文 軟件大小&#xff1a;78.8M 系統要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系統 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM4G或更高 盤丨下載&#xff1a;https://tool.nineya…

平時遇到的錯誤碼及場景?404?400?502?都是什么場景下什么含義,該怎么做 ?

? 一、常見 HTTP 錯誤碼及含義狀態碼含義簡述類型400Bad Request&#xff1a;請求格式有誤客戶端錯誤401Unauthorized&#xff1a;未授權客戶端錯誤403Forbidden&#xff1a;禁止訪問客戶端錯誤404Not Found&#xff1a;資源不存在客戶端錯誤405Method Not Allowed&#xff1a…

基于Tornado的WebSocket實時聊天系統:從零到一構建與解析

引言 在當今互聯網應用中&#xff0c;實時通信已成為不可或缺的一部分。無論是社交媒體、在線游戲還是協同辦公&#xff0c;用戶都期待即時、流暢的交互體驗。傳統的HTTP協議是無狀態的、單向的請求-響應模式&#xff0c;客戶端發起請求&#xff0c;服務器返回響應&#xff0c…

【語義分割】記錄2:yolo系列

圖像分割筆記1、源碼下載2、數據獲取3、環境配置4、模型訓練5、模型推理6、模型部署6.1 yolov5_flask學習7、版本上傳1、源碼下載 git clone https://github.com/ultralytics/ultralytics.gitgit回到對應版本&#xff1a; 方式一&#xff1a;使用 git checkout&#xff08;臨…

ubuntu22.04系統 算力4090服務器 病毒防護 查殺等 運維入門(三)clamAV工具離線查殺

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址&#xff1a;星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 兌換碼要是過期了&#xff0c;可以私信我獲取最新兌換碼&#xff01;&a…

微信小程序文件下載與預覽功能實現詳解

在微信小程序開發中&#xff0c;文件處理是常見需求&#xff0c;尤其是涉及合同、文檔等場景。本文將通過一個實際案例&#xff0c;詳細講解如何實現文件的下載、解壓、列表展示及預覽功能。 功能概述 該頁面主要實現了以下核心功能&#xff1a; 列表展示可下載的文件信息支持 …