【不太正常的題】LeetCode.232:用棧的函數接口實現隊列

🎁個人主頁:我們的五年

🔍系列專欄:初階數據結構刷題

🎉歡迎大家點贊👍評論📝收藏?文章

🚗??1.問題描述:

?題目中說了只能使用兩個棧實現隊列,并且只能使用基本的棧操作。比如:在棧頂進行入棧操作,在棧頂進行出棧,取棧頂元素,還有判空這些基本的棧操作函數。然后使用這些函數實現隊列的基本操作,隊列的特點就是在隊尾插入數據,在隊頭刪除數據,在對頭取數據。

題中說使用兩個棧實現,也給了我們提示。

🚗??2.問題分析:

假如先在一個棧中插入三元素1.2.3。

當使用StackPush函數在PushST進行三次插入以后,就變成了上面的情形,但是如果我們要進行隊列取隊頭的數據,進行隊列刪除隊頭的數據,我們就要先把上面的3和2拿走。從而我們就想到了把左邊棧里面的元素的放到右邊去。

進行上面的操作以后,我們就調用棧的取棧頂的函數就可以拿到元素1,也可以進行取刪除元素1,就可以達到和隊列一樣的性質:先進先出。

插入數據的時候,我們還是在PushST中插入數據,加入先插入4,5.

如果要進行刪除操作,取元素操作也是可以直接在PopST棧中直接取。也是滿足隊列的要求的。但是當我們把PopST的元素都取完以后,我們就要再一次把PushST棧里面的元素導到PopST棧里面。

按照上面的步驟就可以實現隊列的操作。

🚗?3.代碼層面進行解析:

棧的函數接口

先給出棧的接口:

typedef int SLDataType;

typedef struct Stack{

? ? ????????SLDataType* a;

? ????????? int top;

? ? ????????int capacity;

}Stack;

//對棧進行初始化

void StackInit(Stack* ptr);

//對棧進行銷毀

void StackDestroy(Stack* ptr);

//在棧頂插入元素

void StackPush(Stack* ptr, SLDataType x);

//獲取棧頂元素

SLDataType StackTop(Stack* ptr);

//對棧進行判斷,如果為空,返回true,否則返回false

bool StackEmpty(Stack* ptr);

//銷毀棧的棧頂元素

void StackPop(Stack* ptr);

用棧的函數實現隊列

先定義我自己結構體的類型:

根據上面分析也是用兩個棧實現隊列,也就是說我的隊列類型中保護了兩個棧,并且我把這兩個隊列命名為PushST和PopST

typedef struct {Stack PushST;? ? ? ? //把元素新的元素放在這個棧,也就是在這個棧里面實現插入操作Stack PopST;? ? ? ? ?//在這個棧中取數據,刪除數據} MyQueue;

創建隊列,在堆區上申請一塊空間,并且對隊列里面的棧進行初始化

MyQueue* myQueueCreate() {MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));StackInit(&obj->PushST);? ? ? //對PushST和PopST棧進行初始化??StackInit(&obj->PopST);return obj;}

取隊頭元素

int myQueuePeek(MyQueue* obj) {if(StackEmpty(&obj->PopST))    //PopST棧為空的時候就要把PushST棧里面的元素導過來{while(!StackEmpty(&obj->PushST))    //導元素{int Pop=StackTop(&obj->PushST);StackPop(&obj->PushST);StackPush(&obj->PopST,Pop);}}return StackTop(&obj->PopST);    返回PopST棧頂的元素
}

銷毀隊頭元素,并且返回隊頭元素。首先應該保存PopST棧的棧頂元素,然后銷毀棧頂元素。

一個特別巧妙的點就是,我們在進行取隊頭元素的時候,如果PopST為空,取隊頭元素函數就會把PushST里面的元素導到PopST里面,這樣我們在myQueuePop中就避免了導元素這一步驟。

int myQueuePop(MyQueue* obj) {int top=myQueuePeek(obj);    //取隊頭元素StackPop(&obj->PopST);return top;
}

?最后的push函數和判空函數還有銷毀函數也是比較簡單的

//直接在PushST隊列中進行插入
void myQueuePush(MyQueue* obj, int x) {StackPush(&obj->PushST,x);
}//隊列判空,當隊列里面的兩個隊列都為空時才為空
bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->PopST)&&StackEmpty(&obj->PushST);
}//銷毀隊列
void myQueueFree(MyQueue* obj) {StackDestroy(&obj->PopST);StackDestroy(&obj->PushST);
}

🚗?最終代碼:

typedef int SLDataType;typedef struct Stack{SLDataType* a;int top;int capacity;
}Stack;//對棧進行初始化
void StackInit(Stack* ptr);//對棧進行銷毀
void StackDestroy(Stack* ptr);//在棧頂插入元素
void StackPush(Stack* ptr, SLDataType x);//獲取棧頂元素
SLDataType StackTop(Stack* ptr);//對棧進行判斷,如果為空,返回true,否則返回false
bool StackEmpty(Stack* ptr);void StackPop(Stack* ptr);//棧的初始化
void StackInit(Stack* ptr)
{assert(ptr);ptr->a = NULL;ptr->capacity = ptr->top = 0;
}//銷毀棧
void StackDestroy(Stack* ptr)
{assert(ptr);free(ptr->a);ptr->a = NULL;ptr->capacity = ptr->top = 0;	//初始化時,top=0,表示指向棧頂的下一個元素
}//在棧頂插入元素
void StackPush(Stack* ptr, SLDataType x)
{assert(ptr);if (ptr->top == ptr->capacity){int newcapacity = ptr->capacity == 0 ? 4 : ptr->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ptr->a, newcapacity*sizeof(SLDataType));if (tmp == NULL){perror("realloc fail");return;}ptr->a = tmp;ptr->capacity = newcapacity;}ptr->a[ptr->top++] = x;
}//取棧頂元素
SLDataType StackTop(Stack* ptr)
{assert(ptr);assert(!StackEmpty(ptr));return ptr->a[ptr->top - 1];
}//棧判空
bool StackEmpty(Stack* ptr)
{assert(ptr);return ptr->top == 0;
}//銷毀棧頂元素
void StackPop(Stack* ptr)
{assert(ptr);assert(!StackEmpty(ptr));ptr->top--;
}typedef struct {Stack PushST;Stack PopST;
} MyQueue;MyQueue* myQueueCreate() {MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));StackInit(&obj->PushST);StackInit(&obj->PopST);return obj;
}void myQueuePush(MyQueue* obj, int x) {StackPush(&obj->PushST,x);
}int myQueuePop(MyQueue* obj) {int top=myQueuePeek(obj);StackPop(&obj->PopST);return top;
}int myQueuePeek(MyQueue* obj) {if(StackEmpty(&obj->PopST)){while(!StackEmpty(&obj->PushST)){int Pop=StackTop(&obj->PushST);StackPop(&obj->PushST);StackPush(&obj->PopST,Pop);}}return StackTop(&obj->PopST);
}bool myQueueEmpty(MyQueue* obj) {return StackEmpty(&obj->PopST)&&StackEmpty(&obj->PushST);
}void myQueueFree(MyQueue* obj) {StackDestroy(&obj->PopST);StackDestroy(&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);
*/

?

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

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

相關文章

Linux搭建text-generation-webui框架,安裝通義千問大模型,開放對外api,voxta測試對話圖文教程

目錄 text-generation-webui部分 開放對外API 通義千問部分 遠程API對話測試部分 text-generation-webui部分 本來不想發這個文章的,但是自己部署的時候看了挺多人的帖子,很多發的不全面,要么就是跟著他們流程走有些小問題啥的&#xff…

QT程序發布后,mysql在其它電腦設備無法連接數據庫

QT程序發布后,mysql在其它電腦設備無法連接數據庫 D:\mysql-5.7.24-winx64\lib, mysql-5.7.24-winx64是一個壓縮包,用于啟動mysql服務,創建數據庫 壓縮包 解決方法: 拷貝庫到exe的相同目錄,libmysql.dll,libmysql.li…

ElasticSearch 的核心功能

要深入理解 ElasticSearch 的核心功能,需要全面掌握其 全文搜索、分析、聚合 和 索引生命周期管理(ILM) 的設計原理和實際應用。 1. 全文搜索 ElasticSearch 的全文搜索是其核心功能之一,依賴于倒排索引和強大的分詞、相關性評分…

在Nginx部署Web應用,如何保障后端API的安全

1. 使用HTTPS和http2.0 參考:Nginx配置HTTP2.0_nginx 支持 2.0-CSDN博客 2. 設置嚴格的CORS策略 通過add_header指令設置CORS頭。 只允許來自https://frontend.yourdomain.com的請求訪問API location /api/ {if ($http_origin ~* (https://frontend\.yourdomai…

Nginx單向鏈表 ngx_list_t

目錄 基本概述 數據結構 接口描述 具體實現 ngx_list_create ngx_list_init ngx_list_push 使用案例 整理自 nginx 1.9.2 源碼 和 《深入理解 Nginx:模塊開發與架構解析》 基本概述 Nginx 中的 ngx_list_t 是一個單向鏈表容器,鏈表中的每一個節…

es快速掃描

介紹 Elasticsearch簡稱es,一款開源的分布式全文檢索引擎 可組建一套上百臺的服務器集群,處理PB級別數據 可滿足近實時的存儲和檢索 倒排索引 跟正排索引相對,正排索引是根據id進行索引,所以查詢效率非常高,但是模糊…

軟件需求建模方法

軟件需求建模是一個涉及多個學科的領域,其研究方向廣泛且多樣。以下是一些主要的研究方向: 1. 需求工程方法:研究如何更有效地收集、分析、規格化和驗證軟件需求。這包括新的需求工程方法論和工具的開發。 2. 需求管理:關注需求…

軟件項目需求分析的實踐探索(1)

一、項目啟動與規劃 組建團隊 包括項目經理、系統分析師、業務分析師以及可能涉及的最終用戶代表和領域專家等。例如,開發一個醫療管理軟件,就需要有醫療行業的專家參與,確保對醫療業務流程有深入理解。明確各成員的職責,如系統分…

wordpres當前分類調用父分類的名稱和鏈接

在WordPress中&#xff0c;如果你想在當前分類頁面調用并顯示父分類的名稱和鏈接&#xff0c;你可以使用以下代碼片段&#xff1a; <?php // 獲取當前分類的ID $cat_id get_queried_object_id();// 獲取當前分類的父分類ID $parent_id get_term($cat_id, category)->…

前端Python應用指南(三)Django vs Flask:哪種框架適合構建你的下一個Web應用?

《寫給前端的python應用指南》系列&#xff1a; &#xff08;一&#xff09;快速構建 Web 服務器 - Flask vs Node.js 對比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的應用結構與模塊化設計 在上一篇博文中&#xff0c;我們深入探討了Flask框架&#xff0c;…

網絡管理-期末項目(附源碼)

環境&#xff1a;網絡管理 主機資源監控系統項目搭建 &#xff08;保姆級教程 建議點贊 收藏&#xff09;_搭建網絡版信息管理系統-CSDN博客 效果圖 下面3個文件的項目目錄(python3.8.8的虛擬環境) D:\py_siqintu\myproject5\Scripts\mytest.py D:\py_siqintu\myproject5\Sc…

MySQL 常用程序介紹

以下是一些常用的MySQL程序&#xff1a; 程序名作?mysqldMySQL的守護進程即 MySQL 服務器&#xff0c;要使?MySQL 服務器 mysqld必須正在運?狀態mysql MySQL客?端程序&#xff0c;?于交互式輸? SQL 語句或以批處理模式從?件執?SQL的命令??具 mysqlcheck?于檢查、修…

Redis篇--常見問題篇4--大Key(Big Key,什么是大Key,影響及使用建議)

1、概述 大Key&#xff1a;通常是指值&#xff08;Value&#xff09;的長度非常大&#xff0c;實際上鍵&#xff08;Key&#xff09;長度很大也算。通常來說&#xff0c;鍵本身不會很長&#xff0c;占用的內存較少&#xff0c;因此判斷一個鍵是否為bigKey主要看它對應的值的大…

云手機+YouTube:改變通信世界的劃時代技術

隨著科技的不斷進步&#xff0c;手機作為人們生活中不可或缺的工具&#xff0c;也在不斷地更新換代。近年來&#xff0c;一個名為“油管云手機”的全新產品正在引起廣泛的關注和討論。作為一個運用最新科技實現的新型手機&#xff0c;它在通信領域帶來了全新的體驗和革命性的變…

ModbusTCP從站轉Profinet主站案例

一. 案例背景 在復雜的工業自動化場景中&#xff0c;企業常常會采用不同品牌的設備來構建生產系統。西門子SINAMICS G120變頻器以其高性能、高精度的速度和轉矩控制功能&#xff0c;在電機驅動領域應用廣泛。施耐德M580可編程邏輯控制器則以強大的邏輯控制和數據處理能力著稱&…

JS 函數的定義與調用

文章目錄 1. 普通函數-無形參2. 普通函數-有形參3. 普通函數-參數默認值4. 普通函數-返回值5. 立即執行函數6. 匿名函數7. 箭頭函數8. 函數提升 1. 普通函數-無形參 函數定義時沒有指定形參, 調用時仍然可以向其傳遞參數, 通過默認參數 arguments 獲取, arguments 是一個偽數組…

MySQL的索引失效的原因有那些

1. 數據類型不匹配 詳細說明&#xff1a;MySQL在比較不同數據類型的值時&#xff0c;可能會嘗試進行隱式轉換。如果這種轉換導致了復雜度增加或無法直接利用索引&#xff0c;則會導致索引失效。 實例與解決方案&#xff1a; -- 錯誤示例&#xff1a;數據類型不匹配 select *…

邁向未來:.NET技術的持續創新與發展前景

隨著信息技術的飛速發展&#xff0c;編程語言和開發框架不斷涌現&#xff0c;許多技術平臺以其獨特的優勢贏得了開發者的青睞。在這場技術的競爭中&#xff0c;.NET平臺憑借其卓越的性能、廣泛的生態系統以及持續創新的精神&#xff0c;成為了全球開發者的重要選擇。本文將探討…

微信小程序-基于Vant Weapp UI 組件庫的Area 省市區選擇

Area 省市區選擇&#xff0c;省市區選擇組件通常與 彈出層 組件配合使用。 areaList 格式 areaList 為對象結構&#xff0c;包含 province_list、city_list、county_list 三個 key。 每項以地區碼作為 key&#xff0c;省市區名字作為 value。地區碼為 6 位數字&#xff0c;前兩…

Canvas指定三角形內部生成隨機點

使用重心坐標&#xff08;barycentric coordinates&#xff09;或者通過面積比例的方法來確定點是否在三角形內。不過&#xff0c;對于簡單的應用&#xff0c;一種常見的方法是使用隨機點并檢查它們是否在三角形內部。如果不在&#xff0c;就重新生成&#xff0c;直到得到足夠數…