4 C 語言數據結構實戰:棧和隊列完整實現(結構體 + 函數)+ 最小棧解決方案

棧和隊列

1. 棧

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

底層結構選型 棧的實現?般可以使?數組或者鏈表實現,相對??數組的結構實現更優?些。因為數組在尾上插? 數據的代價?較?。

棧的實現

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int STDataType;typedef struct Stack
{STDataType* PST;int top;int capasity;
}Stack;typedef struct MyQueue {Stack pushst;Stack popst;
} MyQueue;
//棧的實現
void StackInit(Stack* ST);
void StackDestroy(Stack* ST);
void StackPush(Stack* ST, STDataType x);
void StackPop(Stack* ST);
void StackPrint(Stack* ST);
int StackIsEmpty(Stack* ST);
STDataType StackTop(Stack* ST);
#include"Stack.h"
//棧的實現
void StackInit(Stack* ST)
{assert(ST);ST->capasity = 4;ST->top = 0;ST->PST =(STDataType*)malloc(sizeof(STDataType)*4);
}
int StackIsEmpty(Stack* ST)
{assert(ST);if (ST->top == 0) {return 1;}else {return 0;}
}
void StackDestroy(Stack* ST)
{assert(ST);free(ST->PST);ST->capasity = 0;ST->top = 0;ST->PST = NULL; 
}
void StackPush(Stack* ST, STDataType x)
{assert(ST);if (ST->top == ST->capasity) {STDataType* temp = (STDataType*)realloc(ST->PST, sizeof(STDataType) * 2 * ST->capasity);if (temp == NULL) {printf("realloc failed\n");exit(1);}ST->PST = temp;ST->capasity = 2 * ST->capasity;}ST->PST[ST->top] = x;ST->top++;
}
void StackPop(Stack* ST)
{assert(ST);if (ST->top) {ST->top--;}
}
void StackPrint(Stack* ST)
{assert(ST);for (int i = 0; i < ST->top; i++){printf("%d ", ST->PST[i]);}printf("top:%d capacity:%d", ST->top,ST->capasity);printf("\n");
}STDataType StackTop(Stack* ST)
{assert(ST);assert(ST->top);return ST->PST[ST->top-1];
} 

最小棧(棧實戰應用)

包含min函數的棧牛客題霸牛客網

//解題思路:1 再搞一個棧2來存儲當前棧1中最小的元素,棧2的棧頂元素就是當前棧1中的最小元素,當棧1最小元素出棧時,棧2也要跟著出棧
2 不要額外棧,把棧存儲的元素類型改為pair類型<棧元素,當前元素到棧底的最小元素>
class Solution {
public:void push(int value) {if(s1.empty()){s1.push({value,value});}else {if(value<=s1.top().second){s1.push({value,value});}else {s1.push({value,s1.top().second});}}}void pop() {s1.pop();}int top() {return s1.top().first;}int min() {return s1.top().second;}stack<pair<int,int>> s1;
};

2. 隊列

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

隊列的實現

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int QNDataType;
typedef struct QueueNode {struct QueueNode* next;QNDataType data;}QN;typedef struct Queue {QN* head;QN* tail;
}Queue;void QueueInit(Queue* Qe);
void QueuePrint(Queue* Qe);
void QueuePush(Queue* Qe, QNDataType x);//隊尾入
void QueuePop(Queue* Qe);//隊頭出
QNDataType QueueFront(Queue* Qe);//取隊頭數據
QNDataType QueueBack(Queue* Qe);//取隊尾數據
int QueueSize(Queue* Qe);//取隊列大小
int QueueIsEmpty(Queue* Qe);//判斷隊列是否為空
void QueueDestroy(Queue* Qe);
#include"Queue.h"void QueueInit(Queue* Qe)
{Qe->head = NULL;Qe->tail = NULL;
}
void QueueDestroy(Queue* Qe)
{assert(Qe);QN* cur = Qe->head;while (cur != NULL) {QN* next = cur->next;free(cur);cur = next;}Qe->tail = Qe->head = NULL;}
int QueueIsEmpty(Queue* Qe)//判斷隊列是否為空
{assert(Qe);return Qe->head == NULL;}
void QueuePrint(Queue* Qe)
{assert(Qe);QN* cur = Qe->head;while (cur!= NULL) {printf("%d ", cur->data);cur = cur->next;}printf("\n");
}
void QueuePush(Queue* Qe, QNDataType x)
{assert(Qe);QN* temp = (QN*)malloc(sizeof(QN));if (temp == NULL) {printf("malloc failed\n");exit(-1); }temp->data = x;temp->next = NULL;if (Qe->tail == NULL) {//第一次入數據Qe->head = temp;Qe->tail = temp;}else {//第二次Qe->tail->next = temp;Qe->tail = temp;}
}
void QueuePop(Queue* Qe)
{assert(Qe);assert(Qe->head);if (Qe->head->next == NULL) {//只有一個節點的時候出數據free(Qe->head);Qe->head = Qe->tail = NULL;}else {//多節點出數據QN* next = Qe->head->next;free(Qe->head);Qe->head = next;}
}QNDataType QueueFront(Queue* Qe)//取隊頭數據
{assert(Qe);assert(Qe->head);//判斷隊頭為空return Qe->head->data;
}QNDataType QueueBack(Queue* Qe)//取隊尾數據
{assert(Qe);assert(Qe->head);//判斷隊頭為空return Qe->tail->data;
}int QueueSize(Queue* Qe)//取隊列大小
{assert(Qe);QN* cur = Qe->head;int size = 0;while (cur!=NULL) {size++;cur = cur->next;}return size;}

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

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

相關文章

Milvus基于docker主機外掛實踐

一、安裝docker與我之前寫的原博客&#xff1a;ubuntu安裝milvus向量數據庫&#xff0c;獲取key不同&#xff0c;原博客獲取key已經過時# 更新Ubuntu軟件包列表和已安裝軟件的版本: sudo apt update# 安裝Ubuntu系統的依賴包 sudo apt-get install ca-certificates curl gnupg …

使用python test測試http接口

使用python test測試http接口獲取token和控制session&#xff0c;后面大多數接口要帶上這些信息 import time import requestsfrom common.aes_algorithm import AES from config.config import Config from config.log import logclass Common:username "admin"pas…

平時只會CRUD,沒有高質量項目經驗,我該怎么辦

我沒有項目經驗怎么辦 首先&#xff0c;不管是應屆生還是社招幾年工作經驗的朋友&#xff0c;除非特別厲害的人&#xff0c;大家都會遇到這個問題。 我們該怎么處理&#xff0c;關注hikktn&#xff01;為你解答這個問題。 問AI世面上那個大廠程序員項目推薦 為什么這么說呢&…

網編.hw.9.10

云盤下載#include <myhead.h> #define SER_IP "192.168.108.93" #define SER_PORT 69 #define addr "192.168.109.6" #define port 8888/******************主程序******************/ int main(int argc, const char *argv[]) {//1、創建一個用于通…

Java調用magic-api中post接口參數問題

Java調用magic-api中post接口參數問題magic官方文檔中只提供了get寫法解決方法magic官方文檔中只提供了get寫法 實測使用官方寫法調用get接口可調通&#xff0c;參數正常獲取&#xff0c;但更換為post寫法后&#xff0c;magic腳本中body獲取為空 Autowired MagicAPIService s…

《sklearn機器學習——管道和復合估計器》聯合特征(FeatureUnion)

超詳細解說 sklearn 中的聯合特征&#xff08;FeatureUnion&#xff09; 1. FeatureUnion 簡介 FeatureUnion 是 scikit-learn 中的一個工具&#xff0c;用于并行地組合多個特征提取器的輸出。它允許你將不同的特征提取方法&#xff08;如文本向量化、數值特征縮放、自定義特征…

Eyeshot 2025.3 3D 圖形工具包

Eyeshot 2025.3 現在支持 E57 格式Eyeshot 2025.3 現在支持 E57 格式&#xff0c;可直接從 3D 掃描系統導入點云、圖像和元數據。Eyeshot 由 devDept 開發&#xff0c;是一款功能全面的 3D 圖形工具包&#xff0c;專為構建工程和 CAD(計算機輔助設計)應用程序的 .NET 開發人員而…

OpenResty 配合 Lua 腳本的使用

OpenResty 配合 Lua 腳本的使用實踐 在高并發互聯網服務中&#xff0c;傳統的 Web 服務器往往難以同時兼顧性能與靈活性。而 OpenResty 作為一個基于 Nginx LuaJIT 的高性能 Web 平臺&#xff0c;能夠讓我們在保持 Nginx 高并發性能的同時&#xff0c;使用 Lua 腳本 動態擴展其…

香港券商櫃臺系統發展分析與市場觀察

香港券商櫃臺系統發展分析與市場觀察 一、市場環境與交易機制變革 2025年以來&#xff0c;香港證券市場表現活躍。港交所現貨市場平均每日成交金額達2,402億港元&#xff0c;同比增長118%。南向交易&#xff08;港股通&#xff09;日均成交額佔比提升至23%&#xff0c;單日淨…

AR技術:多行業數字化轉型的加速引擎

在數字化浪潮的推動下&#xff0c;增強現實&#xff08;AR www.teamhelper.cn &#xff09;技術正突破傳統娛樂和游戲領域的局限&#xff0c;成為各行業數字化轉型的重要力量。從工業制造到醫療健康&#xff0c;從教育培訓到零售購物&#xff0c;AR技術以其獨特的虛實融合能力&…

第6篇、Kafka 高級實戰:生產者路由與消費者管理

Kafka 高級實戰&#xff1a;生產者路由與消費者管理&#xff08;Python 版&#xff09;從基礎到進階&#xff1a;深入理解 Kafka 的生產者消息路由、消費者 Offset 管理&#xff0c;以及 Exactly-Once 語義實現 實戰導向&#xff1a;提供完整的可運行代碼示例&#xff0c;涵蓋自…

基于Python讀取多個excel豎向拼接為一個excel

在Python中&#xff0c;可以使用pandas庫結合glob模塊來遍歷讀取多個Excel文件&#xff0c;并將它們豎向拼接為一個DataFrame對象。以下是完整的實現方法&#xff1a; 文章目錄方法1&#xff1a;使用glob匹配文件 pd.concat()方法2&#xff1a;使用列表推導式&#xff08;更簡…

Linux《進程信號(下)》

在之前的Linux《進程信號&#xff08;上&#xff09;》當中我們已經了解了進程信號的基本概念以及知道了信號產生的方式有哪些&#xff0c;還了解了信號是如何進行保存的&#xff0c;那么接下來在本篇當中就將繼續之前的學習了解信號是如何處理的。除此之外還會了解到中斷的概念…

android 性能優化—ANR

ANR產生原理ANR&#xff08;Application Not Responding&#xff09;是 Android 對 “應用主線程卡死” 的系統級保護機制&#xff1a; 當 輸入事件、廣播、服務 等在規定時間內未被處理完畢&#xff0c;SystemServer 會彈框并殺進程&#xff0c;防止整個系統跟著假死。計時起點…

stm32——單總線,DHT11

目錄 一、單總線協議的原理和應用 單總線協議指的是只采用一根信道來進行數據傳輸&#xff0c;通信指的是雙方&#xff08;MCU與傳感器&#xff09;通過一根信道進行數據交互&#xff0c;所以按照數據的傳輸方向&#xff0c;只能采用半雙工通信方式&#xff0c;比較典型的傳感器…

css3之grid布局

容器&#xff1a;gird container開啟grid布局的元素 項目&#xff1a;grid items容器里面的子元素&#xff0c;不包括后代元素 顯式網格&#xff08;單元格&#xff09;&#xff1a;通過grid-template-columns和grid-template-rows指定的網格&#xff0c;注意項目不等于單元格,…

C++容器:list

一、list的介紹及使用 list是可以在常數范圍內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。list的底層是雙向鏈表結構&#xff0c;雙向鏈表中每個元素存儲在互不相關的獨立節點中&#xff0c;在節點中通過指針指向其前一個元素和后一個元素…

STL庫——map/set(類函數學習)

? ? ? ? ? づ?ど &#x1f389; 歡迎點贊支持&#x1f389; 個人主頁&#xff1a;勵志不掉頭發的內向程序員&#xff1b; 專欄主頁&#xff1a;C語言&#xff1b; 文章目錄 前言 一、序列式容器和關聯式容器 二、set 系列的使用 2.1、set 和 multiset 參考文檔 2.2、set…

計算機網絡IP協議

1.TCP協議1.1 確認應答1.2 超時重傳1.3 連接管理1.4 滑動窗口1.5 流量控制1.6 擁塞控制 1.7 延時應答1.8 稍帶應答1.9 粘包問題1.10 異常情況2.IP協議 網絡層2.1 NAT機制下的幾種情況:同一個局域網中,內網ip訪問 內網 ip,可以的不同局域網中,內網IP訪問 內網IP,不行~~外網IP訪…

Windows電腦如何查看wifi連接記錄及連接時間

查詢WIFI 連接的記錄 echo netsh wlan show profiles netsh wlan show wlanreport POWERSHELL 腳本 Get-WinEvent -LogName Microsoft-Windows-WLAN-AutoConfig/Operational | Where-Object { $_.Id -in (8001,8002) } | Select-Object TimeCreated, Id, {Name"Action…