第二十四天(數據結構:棧和隊列)隊列實踐請看下一篇

棧和隊列棧 : 是限定在表尾進行插入和刪除操作的線性表實現是一回事,但是必須要滿足棧的基本特點它的設計思路是:先進后出,后進先出棧有兩端1 棧頂(top) :插入數據刪除數據都只能在這一端訪問也只能訪問棧頂2 棧底(bottom) : 棧底是不會動實現棧我們就需要實現如下操作:init    初始化這個棧top     返回棧頂元素,但是不出棧empty   判斷棧是否為空size    棧里面有多少個元素push    入棧pop     出棧clear   清空這個棧destory 銷魂這個棧我們可以使用鏈式結構或者順序結構來實現這個棧1 鏈式 --- 利用鏈表,對鏈表的操作進行限定struct stacknode{int data;struct stacknode * prev;};//利用頭節點來搞定stacknode的管理  對于用戶來說是最友好的struct ListStack{struct stacknode * top;//指向棧頂元素的int num;//為了防止爆棧(溢出)  我們可以弄一個最大值來進行限定int maxnum;.....};2 順序 --- 利用數組,對數組的操作進行限定struct ArrayStack //同樣是為了管理我們的棧的{//int stack[];//容納所有的棧里面的元素int * stack;//我給你開辟一個數組出來讓stack去保存int  top;//指向棧頂元素的int num;//為了防止爆棧(溢出)  我們可以弄一個最大值來進行限定int maxnum;.....};先弄一遍鏈式棧,請實現順序棧隊列:是限定在表尾進行插入,在表頭刪除操作的線性表實現是一回事,但是必須要滿足隊列的基本特點它的設計思路是:先進先出,后進后出有兩頭:隊頭(front),刪除操作在這一邊進行隊尾(rear),插入操作在這一邊進行
隊列在實現的時候有兩種1 鏈式隊列 --- 鏈表實現 -> 不存在假溢出struct queuenode{int data;struct queuenode * next;//做尾插};//利用頭節點來搞定queuenode的管理  對于用戶來說是最友好的struct ListQueue{struct stacknode * front;//指向隊頭元素的 刪除的時候砍掉這個頭struct stacknode * rear;//指向隊尾元素的  插入的時候往rear的后面進行插入int num;//隊列里面有多少個元素//為了防止爆隊(溢出)  我們可以弄一個最大值來進行限定int maxnum;.....};2 順序隊列 --- 利用數組來實現根據隊列的特點我們可以知道入隊出隊front rear都是在++總有一個時候隊列沒有滿,但是入隊的時候已經溢出了 -- 假溢出因此我們設計順序隊列一定要設計為循環隊列讓前面已經出隊的地方可以繼續容納新的元素設計循環隊列有幾種思路1 用num來表示我們的循環隊列里面有多少個元素只要num沒有達到它的最大容納上限我就可以繼續入隊只是rear跑到最后去了之后,我們需要讓它從頭開始2 我們可以利用front 和 rear來進行元素個數,是否為空,是否滿的判斷-> 沒有變量num來對我們的元素個數來進行判斷 ---- 這種是常用的根據我們的分析可以知道 當front == rear的時候沒有辦法判斷這個隊列是空的還滿的因此循環隊列設計的時候,我們實際隊列容納個數要比最大的容納個數少一個maxnum == 5,實際隊列容納就是 5 - 1公式:隊空的判斷:front == rear隊滿的判斷:(rear + 1) % maxnum == front隊列的元素個數:(rear - front + maxnum) % maxnumstruct ArrayQueue //同樣是為了管理我們的隊列的{//int queue[];//容納所有的隊列里面的元素int * queue;//我給你開辟一個數組出來讓queue去保存int  front;//指向對頭元素的 指向要刪除的數據int rear;//指向隊尾元素 指向要插入的數據//為了防止爆隊(溢出)  我們可以弄一個最大值來進行限定int maxnum; // 實際隊列容納個數為 maxnum - 1};隊列需要實現如下操作init        初始化這個隊列front       返回隊頭元素,但是不出隊empty       判斷是否為空full        判斷是否為滿size        返回元素個數push(inqueue)        入隊pop(outqueue)         出隊clear       清空這個隊列destory     銷毀這個隊列搞定循環隊列,然后將鏈式隊列寫出來棧最基本的應用就是算表達式的值2+3*5-6*7+8*9-10%3=你輸入2+3*5-6*7+8*9-10%3=這個字符串簡單一點就用scanf(%s) -> 中間就不能有空格回車就會得到它的結果gets -> 從終端獲取一行字符串不想要警告,請使用fgets鏈式棧

.h與.c

#ifndef __LISTSTACK_H__
#define __LISTSTACK_H__#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef int LS_DataType;
#define LS_ERRORVALUE (LS_DataType)(1 << 31)//棧的錯誤值//節點
typedef struct LS_Node
{LS_DataType _data;//棧的數據struct LS_Node * _next;//寫next就用頭插
}LS_Node;//管理棧的頭節點
typedef struct
{LS_Node * _top;//棧頂  插入刪除訪問都這一端int _num;//現在棧里面有多少個元素int _maxnum;//最大的容納個數
}ListStack;//init    初始化這個棧
//maxnum:程序員限定的最大元素個數   如果小于等于0   默認10000000
ListStack * ListStack_init(int maxnum);//top     返回棧頂元素,但是不出棧
//返回LS_ERRORVALUE表示失敗
LS_DataType ListStack_top(ListStack * st);//empty   判斷棧是否為空
bool ListStack_empty(ListStack * st);//full    判斷是不是滿了
bool ListStack_full(ListStack * st);//size    棧里面有多少個元素
int ListStack_size(ListStack * st);//push    入棧  失敗返回false
bool ListStack_push(ListStack * st,const LS_DataType data);//pop     出棧 沒有返回元素  失敗返回false
//如果你有需求返回元素也是可以的
//如果你要得到出棧元素 你需要先top再pop
bool ListStack_pop(ListStack * st);//clear   清空這個棧
//callback是否要處理數據,傳NULL為不處理
void ListStack_clear(ListStack * st,void (*callback)(const LS_DataType));//destory 銷魂這個棧
//callback是否要處理數據,傳NULL為不處理
void ListStack_destory(ListStack ** st,void (*callback)(const LS_DataType));#endif
#include "ListStack.h"//創建棧的節點  這個接口是不需要給用戶用的
static LS_Node * LS_Node_create(const LS_DataType data)
{LS_Node * ptr = (LS_Node *)calloc(1,sizeof(LS_Node));ptr ->_data = data;return ptr;
}//init    初始化這個棧
//maxnum:程序員限定的最大元素個數   如果小于等于0   默認10000000
ListStack * ListStack_init(int maxnum)
{if(maxnum <= 0){maxnum = 10000000;}ListStack * st = (ListStack *)calloc(1,sizeof(ListStack));st ->_maxnum = maxnum;return st;
}//top     返回棧頂元素,但是不出棧
//返回LS_ERRORVALUE表示失敗
LS_DataType ListStack_top(ListStack * st)
{if(ListStack_empty(st))//棧是空的 返回不了一點return LS_ERRORVALUE;return st ->_top ->_data;
}//empty   判斷棧是否為空
bool ListStack_empty(ListStack * st)
{if(!st)return true;return st ->_num == 0;
}
//full    判斷是不是滿了
bool ListStack_full(ListStack * st)
{if(!st)return true;return st ->_num == st ->_maxnum;
}
//size    棧里面有多少個元素
int ListStack_size(ListStack * st)
{return !st ? 0 : st ->_num;
}//push    入棧  失敗返回false
bool ListStack_push(ListStack * st,const LS_DataType data)
{//入棧就是一個頭插if(!st || ListStack_full(st))return false;//先弄一個節點LS_Node * ptr = LS_Node_create(data);//對這個節點進行頭插ptr ->_next = st ->_top;st ->_top = ptr;//將棧頂弄到新加入的節點上面來st ->_num++;return true;
}//pop     出棧 沒有返回元素  失敗返回false
//如果你有需求返回元素也是可以的
//如果你要得到出棧元素 你需要先top再pop
bool ListStack_pop(ListStack * st)
{if(!st || ListStack_empty(st))return false;//將top給刪除LS_Node * ptr = st ->_top;//標記要刪除的節點st ->_top = st ->_top ->_next;//top到后面去了st ->_num--;//數量少一個了ptr ->_next = NULL;//孤立這個節點free(ptr);return true;
}//clear   清空這個棧
//callback是否要處理數據,傳NULL為不處理
void ListStack_clear(ListStack * st,void (*callback)(const LS_DataType))
{while(!ListStack_empty(st))//只要你的棧不是空的 就一直出棧{LS_DataType data = ListStack_top(st);//獲取棧頂元素ListStack_pop(st);if(callback && LS_ERRORVALUE != data){callback(data);}}
}
//destory 銷魂這個棧
//callback是否要處理數據,傳NULL為不處理
void ListStack_destory(ListStack ** st,void (*callback)(const LS_DataType))
{if(!st)return;ListStack_clear(*st,callback);//先清空//將頭節點給刪除free(*st);*st = NULL;
}

順序棧:

.h與.c

#ifndef __ARRAYSTACK_H__
#define __ARRAYSTACK_H__#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>typedef int AS_DataType;
#define AS_ERRORVALUE (AS_DataType)(1 << 31)//棧的錯誤值typedef struct  //同樣是為了管理我們的棧的
{AS_DataType * _st_arr;//我給你開辟一個數組出來讓_st_arr去保存數據int  _top;//指向棧頂元素的  下標 入棧從_top開始,棧頂元素為_top-1int _num;//為了防止爆棧(溢出)  我們可以弄一個最大值來進行限定int _maxnum;
}ArrayStack;//init    初始化這個棧
//maxnum:程序員限定的最大元素個數   如果小于等于0   默認10000000
ArrayStack * ArrayStack_init(int maxnum);//top     返回棧頂元素,但是不出棧
//返回LS_ERRORVALUE表示失敗
AS_DataType ArrayStack_top(ArrayStack * st);//empty   判斷棧是否為空
bool ArrayStack_empty(ArrayStack * st);//full    判斷是不是滿了
bool ArrayStack_full(ArrayStack * st);//size    棧里面有多少個元素
int ArrayStack_size(ArrayStack * st);//push    入棧  失敗返回false
bool ArrayStack_push(ArrayStack * st,const AS_DataType data);//pop     出棧 沒有返回元素  失敗返回false
//如果你有需求返回元素也是可以的
//如果你要得到出棧元素 你需要先top再pop
bool ArrayStack_pop(ArrayStack * st);//clear   清空這個棧
//callback是否要處理數據,傳NULL為不處理
void ArrayStack_clear(ArrayStack * st,void (*callback)(const AS_DataType));//destory 銷魂這個棧
//callback是否要處理數據,傳NULL為不處理
void ArrayStack_destory(ArrayStack ** st,void (*callback)(const AS_DataType));#endif
#include "ArrayStack.h"//init    初始化這個棧
//maxnum:程序員限定的最大元素個數   如果小于等于0   默認10000000
//入棧從_top開始,棧頂元素為_top-1
ArrayStack * ArrayStack_init(int maxnum)
{if(maxnum <= 0) {printf("動動你的豬腦,0和負數能存東西嗎,給你開了10000000,慢慢填吧\n");maxnum = 10000000;}ArrayStack *st = (ArrayStack *)calloc(1,sizeof(ArrayStack));st ->_maxnum = maxnum;//開辟數組  用于保存數據st ->_st_arr = (AS_DataType *)calloc(st ->_maxnum,sizeof(AS_DataType));return st;
}//top     返回棧頂元素,但是不出棧
//返回LS_ERRORVALUE表示失敗
AS_DataType ArrayStack_top(ArrayStack * st)
{if (ArrayStack_empty(st)) {return AS_ERRORVALUE;}return st ->_st_arr[st ->_top - 1];
}//empty   判斷棧是否為空
bool ArrayStack_empty(ArrayStack * st)
{if (!st || st ->_num == 0) {return true;}return false;
}//full    判斷是不是滿了
bool ArrayStack_full(ArrayStack * st)
{if (!st || st ->_num == st ->_maxnum) {return true;}return false;
}//size    棧里面有多少個元素
int ArrayStack_size(ArrayStack * st)
{if (!st) {return AS_ERRORVALUE;}return st ->_num;
}//push    入棧  失敗返回false
bool ArrayStack_push(ArrayStack * st,const AS_DataType data)
{if (!st || ArrayStack_full(st)) {return false;}st ->_st_arr[st ->_top] = data;st ->_top++;st ->_num++;return true;
}//pop     出棧 沒有返回元素  失敗返回false
//如果你有需求返回元素也是可以的
//如果你要得到出棧元素 你需要先top再pop
bool ArrayStack_pop(ArrayStack * st)
{if (ArrayStack_empty(st)) {return false;}st ->_top--;st ->_num--;return true;
}//clear   清空這個棧
//callback是否要處理數據,傳NULL為不處理
void ArrayStack_clear(ArrayStack * st,void (*callback)(const AS_DataType))
{while (!ArrayStack_empty(st)) {ArrayStack_pop(st);}
}//destory 銷魂這個棧
//callback是否要處理數據,傳NULL為不處理
void ArrayStack_destory(ArrayStack ** st,void (*callback)(const AS_DataType))
{free((*st) ->_st_arr);free(*st);*st =NULL;}

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

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

相關文章

三、Spark 運行環境部署:全面掌握四種核心模式

作者&#xff1a;IvanCodes 日期&#xff1a;2025年7月25日 專欄&#xff1a;Spark教程 Apache Spark 作為統一的大數據分析引擎&#xff0c;以其高性能和靈活性著稱。要充分利用Spark的強大能力&#xff0c;首先需要根據不同的應用場景和資源環境&#xff0c;正確地部署其運行…

【Django】-2- 處理HTTP請求

一、request 請求 先理解&#xff1a;Request 是啥&#xff1f;用戶訪問你的網站時&#xff0c;會發一個 “請求包” &#x1f4e6; &#xff0c;里面裝著&#xff1a;想訪問啥路徑&#xff1f;用啥方法&#xff08;GET/POST 等&#xff09;&#xff1f;帶了啥頭信息&#xff0…

飛算 JavaAI:突破效率邊界的代碼智能構造平臺

飛算 JavaAI&#xff1a;突破效率邊界的代碼智能構造平臺 一、引言&#xff1a;數字化浪潮下的開發效率困局與破局路徑 當企業數字化轉型駛入深水區&#xff0c;軟件開發正面臨需求迭代頻次激增、人力成本高企、技術架構復雜化的多重挑戰。傳統開發模式中&#xff0c;從需求分…

國家科學技術獎答辯PPT案例_科技進步獎ppt制作_技術發明獎ppt設計美化_自然科學獎ppt模板 | WordinPPT

“國家科學技術獎”是在科學技術領域設立的最高榮譽&#xff0c;旨在獎勵在科學技術進步活動中做出突出貢獻的個人和組織&#xff0c;從而推動國家科學技術事業的發展&#xff0c;加快建設科技強國。科學技術獎是國內科技界的最高殿堂&#xff0c;是對做出杰出貢獻的科技工作者…

如何通過黑白棋盤進行定位配準融合?(前后安裝的兩個相機)

一.總結: 完整流程 &#xff1a;硬件準備 → 數據采集 → 空間統一 → 相機標定&#xff08;內參畸變&#xff09; → 外參求解 → 定位配準融合 → 校驗 → 生成映射表 → 上線remap驗證 我們場景流程 &#xff1a;硬件準備 → 數據采集 → 空間統一 → 定位配準融合 → …

【node】token的生成與解析配置

在用戶登錄成功之后為了記錄用戶的登錄狀態通常會將用戶信息編寫為一個token&#xff0c;通過解析token判斷用戶是否登錄。 token的生成 JSON Web Token&#xff08;JWT&#xff09; 是一種基于JSON的輕量級身份驗證和授權機制。它是一種開放標準&#xff08;RFC 7519&#xff…

yolo 、Pytorch (5)IOU

一、簡介 IOU的全稱為交并比&#xff08;Intersection over Union&#xff09;&#xff0c;是目標檢測中使用的一個概念&#xff0c;IoU計算的是“預測的邊框”和“真實的邊框”的交疊率&#xff0c;即它們的交集和并集的比值。最理想情況是完全重疊&#xff0c;即比值為1。 …

【銀河麒麟服務器系統】自定義ISO鏡像更新內核版本

自定義ISO鏡像更新內核版本 鏡像制作流程 環境 更新倉庫 準備新版本內核包 內核清單簡介 已下載軟件包版本 更新內核包 更新鏡像源 制作自動化鏡像 修改引導 修改UEFI引導 傳統引導 修改ks文件內容 打包鏡像 mkisofs參數說明 封裝鏡像命令 常見問題解決方案 鏡像制作流程 #merm…

JVM 調優中JVM的參數如何起到調優動作?具體案例,G1GC垃圾收集器參數調整建議

JVM調優參數 在JVM調優過程中&#xff0c;通過調整JVM參數可以優化Java應用程序的性能。不同的應用場景可能需要不同的調優策略和參數配置。下面將介紹幾個常見的調優場景以及相應的JVM參數設置&#xff0c;并給出具體案例說明。 1. 堆內存大小調整 問題描述&#xff1a;應用程…

TGD第十一篇:卷積神經網絡中的TGD特征

文章目錄一、直覺上重要的視覺特征二、視覺神經網絡首層試圖自主學習 TGD 算子權重2.1 AlexNet2.2 Vision Transformer2.3 MLPMixer三、針對直覺的驗證試驗3.1 小樣本集自然圖像分類任務3.2 小樣本集醫學圖像分割任務四、結語早在 2012 年&#xff0c;卷積神經網絡 AlexNet 就已…

【源力覺醒 創作者計劃】文心大模型開源:從封閉研發到生態共建的轉折點

前言 人工智能的浪潮在近幾年席卷全球&#xff0c;不僅顛覆了傳統技術路徑與行業習慣&#xff0c;更在大模型領域掀起了一場激烈的生態爭奪戰。自去年起&#xff0c;"百模大戰"的硝煙彌漫&#xff0c;微軟、谷歌、百度、阿里等科技巨頭紛紛入局&#xff0c;在大模型的…

思科 UCS Fabric Interconnect 和 UCS Manager 簡介

UCS Manager&#xff08;UCSM&#xff09;安裝在 Fabric Interconnect&#xff08;FI&#xff09;上&#xff0c;并且是UCS架構的集中管理平臺&#xff0c;允許你管理所有與計算、網絡和存儲相關的配置。1. UCS Manager 安裝位置UCS Manager 是在 UCS Fabric Interconnect&…

C語言結構體、位段、枚舉、聯合體

結構體&#xff1a;定義&#xff1a;結構體就是一堆值的集合初始化&#xff1a;#include<stdio.h> #include <stddef.h> struct S {char ch;int n; };int main() {struct S s1 { a, 5 };S s2{ b,6 };printf("s1 ch:%c , n:%d\n", s1.ch, s1.n);printf(&…

AI產品經理面試寶典第61天:AI產品體驗、數據安全與架構實戰解析

1. 如何提升 AI 產品的用戶體驗? 1.1 問:如何提升 AI 產品的用戶體驗? 答: 提升 AI 產品的用戶體驗可以從以下幾個方面入手: 可解釋性增強:AI模型的輸出往往較為“黑盒”,用戶難以理解其決策邏輯。通過可視化、自然語言解釋、關鍵特征展示等方式,增強用戶對AI決策過程…

以微服務為基礎搭建一套腳手架開始前的介紹

書接上回<java一個腳手架搭建-CSDN博客> 這個腳?架項?開發前&#xff0c;你要大概的了解一下這些東西&#xff1a; Java基礎、IDEA使?、Maven基礎 ? Linux基礎 ? Springboot/Spring Cloud 基礎 ? MySQL基礎 ? Redis基礎 ? RabbitMQ基礎 ? Docker基礎 ? Git基…

Excel接入deepseek

先進入deepseek官網&#xff1a;DeepSeek | 深度求索 點擊API開放平臺&#xff1a; 確保余額里有錢: 創建APIkey: 復制到.txt文件中儲存好 插入VBA代碼&#xff1a; Function OptimizeEbayTitle(originalTitle As String) As StringDim Prompt As StringPrompt "作為…

【計組】概述

目錄 計算機層次結構 計算機硬件 所有用戶&#xff08;程序員&#xff09;可見 所有用戶&#xff08;程序員&#xff09;透明 匯編程序員可見 計算機軟件 從源程序到可執行文件 計算機性能指標 字長 運算速度 單位換算 存儲 速率 時間 計算機層次結構 計算機硬件…

Web15題(7.28~8.3)

&#xff08;1&#xff09;SQL注入 [NSSRound#1 Basic]sql_by_sql 登錄界面 嘗試二次注入覆蓋 admin 用戶&#xff0c;但是發現注釋符 # 被過濾了&#xff0c;--可以 但是無效了 奧原來是密碼輸錯了 然后進行修改密碼&#xff0c;修改以后就可以登錄admin賬戶 查詢按鈕也不…

《Python 實用項目與工具制作指南》· 1.2 選擇與配置Python代碼編輯器

1.2 選擇與配置 Python 代碼編輯器 安裝好 Python 環境后&#xff0c;我們還需要一款合適的代碼編輯器來編寫、運行和調試代碼。就像作家需要趁手的鋼筆&#xff0c;程序員也需要好用的編輯器 —— 它能幫你自動補全代碼、高亮語法錯誤&#xff0c;讓開發 “題目數據生成器”“…

Kali基礎知識點【2】

Nmap信息收集nmap&#xff1a;網絡掃描器&#xff0c;收集網絡信息 openVAS:系統漏洞掃描器Nmap基礎命令 nmap 目標主機&#xff1a;收集開放的端口 nmap -O 目標主機&#xff1a;收集目標主機的操作系統 nmap -sP 網段/子網掩碼&#xff1a;掃描目標網段上開啟的主機 nmap -sV…