刷爆leetcode第六期

題目一 用隊列實現棧

請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty)。

實現 MyStack 類:

void push(int x) 將元素 x 壓入棧頂。
int pop() 移除并返回棧頂元素。
int top() 返回棧頂元素。
boolean empty() 如果棧是空的,返回 true ;否則,返回 false 。

注意:

你只能使用隊列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 這些操作。
你所使用的語言也許不支持隊列。 你可以使用 list (列表)或者 deque(雙端隊列)來模擬一個隊列 , 只要是標準的隊列操作即可。

來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/implement-stack-using-queues

?

我們先來分析下題目

要求用兩個隊列實現一個棧 并且實現四種操作

我們來看第一個Push操作

棧的特點是什么? 先進后出

隊列的特點是什么? 先進先出

來看圖

有思路了?

圖上是兩個隊列

我們假設 注意啊 是假設

第一行的圖 它就是一個棧

那么我們可以判斷出 它的數據插入順序就是 1 2 3 4?

這個時候隊列的頭就是棧的尾

如果我們這個時候需要刪除棧的頭數據應該怎么辦呢?

我們都知道隊列的數據只能是從頭開始出

也就是說 比如要將隊列前面的1 2 3 全部出完之后才能開始出 4

但是我們不可能會拋棄之前的數據啊

這個時候我們就想到了第二個隊列的用處了

只需要將我Pop的數據使用第二個隊列來接受就可以

實現起來的圖大概是這樣子

?

這個時候我們就能刪除掉頭數據了

如果需要再刪除一個怎么辦呢?

那么只需要將上面的操作再重復一次就好了

這個時候的插入數據只需要往不為空的隊列插入數據就可以了

要求首元素就是返回隊列的尾

要求尾元素就是返回隊列的頭

也就是兩個步驟

1.保持一個隊列為空,一個隊列存數據

2.出棧,把前面的數據倒入空隊列

接下來我們來實現代碼

把所有的隊列代碼以及接口函數拷貝進去

第一步?定義結構體

我們來看這個 我們應該怎么定義我們的Stack結構體呢?

既然是兩個隊列的實現的

那么是不是可以放兩個隊列的結構在里面?

仔細一想好像可行

我們來試試

typedef struct {Queue q1;Queue q2;
} MyStack;

畫個圖方便大家理解

三個結構體的關系一目了然

?第二步 實現創建(初始化)

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) {Queue*emptyQ = &obj->q1;Queue*nonemptyQ = &obj->q2;if(!QueueEmpty(&obj->q1)){emptyQ = &obj->q2;nonemptyQ=&obj->q1;}//倒數據while(QueueSize(nonemptyQ)>1){QueuePush(emptyQ,QueueFront(nonemptyQ));QueuePop(nonemptyQ);}//記錄刪除值 刪掉int top = QueueFront(nonemptyQ);QueuePop(nonemptyQ);return top;
}

第五步?返回頭的值

這里我們可以分兩種情況討論

如果1不為空就返回1的尾值

如果2不為空就返回2的尾值

int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}

第六步 判空

這步就很簡單,只需要判斷1和2是否都為空,都為空即空

bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);
}

第七步 釋放

這里要依次釋放銷毀,類似套娃

void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

源碼

typedef int QDateType;
typedef struct QueueNode
{struct QueueNode* next;QDateType date;
}QNode;
typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;
//初始化
void QueueInit(Queue* pq);
//銷毀
void QueueDestroy(Queue* pq);
//隊進
void QueuePush(Queue* pq, QDateType x);
//隊出
void QueuePop(Queue* pq);
//判斷為空
bool QueueEmpty(Queue* pq);
//個數
int QueueSize(Queue* pq);
//隊尾
QDateType QueueBack(Queue* pq);
//對頭
QDateType QueueFront(Queue* pq);
//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}
//銷毀
void QueueDestroy(Queue* pq)
{assert(pq);//兩個結構體依次銷毀 先銷毀QNodeQNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}//再置空Queuepq->head = pq->tail = NULL;pq->size = 0;
}
//隊進
void QueuePush(Queue* pq, QDateType x)
{assert(pq);//開辟新節點QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}//賦值newnode->next = NULL;newnode->date = x;//判斷是否為空if (pq->head == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}//個數要++pq->size++;
}
//隊出
void QueuePop(Queue* pq)
{assert(pq);assert(pq->head!=NULL);//只有一個節點if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{//保存下一位QNode* next = pq->head->next;free(pq->head);pq->head = next;//迭代}//個數要--pq->size--;
}
//判斷為空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
//大小
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
//隊尾
QDateType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->date;
}
//對頭
QDateType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->date;
}typedef struct {Queue q1;Queue q2;
} MyStack;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) {Queue*emptyQ = &obj->q1;Queue*nonemptyQ = &obj->q2;if(!QueueEmpty(&obj->q1)){emptyQ = &obj->q2;nonemptyQ=&obj->q1;}//倒數據while(QueueSize(nonemptyQ)>1){QueuePush(emptyQ,QueueFront(nonemptyQ));QueuePop(nonemptyQ);}//記錄刪除值 刪掉int top = QueueFront(nonemptyQ);QueuePop(nonemptyQ);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);
}

以上便是本文所有內容了,如有錯誤請各位大佬不吝賜教,感謝留言

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

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

相關文章

【漏洞復現】大華智能物聯綜合管理平臺 fastjson遠程代碼執行漏洞

0x01 產品簡介 大華ICC智能物聯綜合管理平臺對技術組件進行模塊化和松耦合,將解決方案分層分級,提高面向智慧物聯的數據接入與生態合作能力。 0x02 漏洞概述 由于大華智能物聯綜合管理平臺使用了存在漏洞的Fastson組件,未經身份驗讓的攻擊者可利用 /e…

M功能-支付平臺(六)

target:離開柬埔寨倒計時-217day 今天突然發現我在csdn居然把我ip屬地搞出來了,之前都沒注意到,哎 前言 M功能演示版本做到后期(也就是第二周的后面3天)真的很心酸,這邊安排的4后端后面都放棄了,覺得做不出來&#…

ARM-V9 RME(Realm Management Extension)系統架構之系統能力的內存隔離和保護

安全之安全(security)博客目錄導讀 目錄 一、內存隔離和保護 1、顆粒PAS過濾Granular PAS filtering 2、Cache的一致性維護 2.1 物理別名點 Point of Physical Aliasing (PoPA) 2.2 加密點 3、內存(DRAM)保護 3.1 內存加密和完整性 3.2 DRAM scrubbing 本博客探討 RME…

網絡編程 —— Http使用httpClient實現頁面爬蟲

先去找類型的a標簽 取出圖片所在網址 取出https://desk.3gbizhi.com/deskMV/438.html 搭建Form界面 Http類 public static HttpClient Client { get; } static Http() {HttpClientHandler handler new HttpClientHandler();//處理消息對象//ServerCertificateCustomValidat…

安卓手機APP開發___設置鬧鐘

安卓手機APP開發___設置鬧鐘 目錄 概述 設置不精確鬧鐘 在特定時間后發出鬧鐘 在特定時間范圍內觸發鬧鐘 以大致有規律的時間間隔響起重復鬧鐘 設置精確的鬧鐘 系統會在未來的某個精確時刻調用精確鬧鐘。 可能不需要精確鬧鐘的用例 設置精確鬧鐘的方法 系統資源消耗…

萬億應急國債項目之通信指揮類應急裝備多鏈路聚合通信設備在應急行業中的重要作用

萬億應急國債項目的推出,無疑是我國在應急領域的一次重大舉措。在這一宏大藍圖中,通信指揮類應急裝備的多鏈路聚合通信設備顯得尤為重要,其在應急行業中所發揮的作用,堪稱不可或缺的關鍵一環。 通信指揮是應急響應中的核心環節&a…

QT C++ 讀寫mySQL數據庫 圖片 例子

在上篇文章中描述了怎樣搭建讀寫數據庫的環境。 本文更進一步,描述了讀寫mySQL數據庫,字符、整型數字、圖片。讀寫圖片相對難點。 數據庫的圖片字段用BLOB,如果圖片較大要用longblob,否則會報錯。 另外,讀寫數據庫都使用了短連…

Pytorch 星號*放在tensor前的作用

假如有一個多維tensor,名為id,那么*id的意思是什么呢? GPT答: 如果 id 是一個多維張量,那么 *id 在這種情況下會將這個多維張量解包成一個張量序列,其中每個元素都是一個更低維度的張量。具體來說&#x…

圖形學初識--空間變換

文章目錄 前言正文矩陣和向量相乘二維變換1、縮放2、旋轉3、平移4、齊次坐標下總結 三維變換1、縮放2、平移3、旋轉繞X軸旋轉:繞Z軸旋轉:繞Y軸旋轉: 結尾:喜歡的小伙伴可以點點關注贊哦 前言 前面章節補充了一下基本的線性代數中…

前端Vue小兔鮮兒電商項目實戰Day02

一、Pinia快速入門 此處見:Vue從入門到實戰Day12-CSDN博客 二、創建項目并精細化配置 1. 創建項目 2. src目錄調整 ①刪除一些初始化的默認文件 清空assets、components、store、views文件夾下的內容; ②修改剩余代碼內容 router/index.js import …

一個程序員的牢獄生涯(44)詢問

星期一 詢 問 在號子里開始了下午坐班的時候,過道內的大鐵柵欄被管教打開,我聽到開鎖的聲音后,心里變得激動起來。盼望著腳步聲能停在我們的號子門口,然后打開鐵門,喊一聲“眼鏡,出來!”。 通道內這次進來的是秦所,但他并沒有在我們號子門口停留,只是在走過的時候,低…

華為昇騰310 ATC模型轉換工具安裝

參考: https://bbs.huaweicloud.com/blogs/393282?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=other&utm_content=content https://www.hiascend.com/document/detail/zh/canncommercial/601/inferapplicationdev/atctool/atctool_0004.html 1、基本工具…

js知識點之閉包

閉包 什么是閉包 閉包,是 JavaScript 中一個非常重要的知識點,也是我們前端面試中較高幾率被問到的知識點之一。 打開《JavaScript 高級程序設計》和《 JavaScript 權威指南》,會發現里面針對閉包的解釋各執一詞,在網絡上搜索關…

Java中如何指定jdk的版本運行jar包

你的jdk安裝的目錄\bin\java -jar 你的jar包名字.jar 這是我的代碼示例 C:\Users\86177\.jdks\corretto-17.0.10\bin\java -jar big_event_study2-0.0.1- SNAPSHOT.jar

23種設計模式之一— — — —裝飾模式詳細介紹與講解

裝飾模式詳細講解 一、定義二、裝飾模式結構核心思想模式角色模式的UML類圖應用場景模式優點模式缺點 實例演示圖示代碼演示運行結果 一、定義 裝飾模式(別名:包裝器) 裝飾模式(Decorator Pattern)是結構型的設計模式…

LeetCode 每日一題 數學篇 2651.計算列車到站時間

給你一個正整數 arrivalTime 表示列車正點到站的時間(單位:小時),另給你一個正整數 delayedTime 表示列車延誤的小時數。 返回列車實際到站的時間。 注意,該問題中的時間采用 24 小時制。 int findDelayedArrivalTi…

學業輔導導師:文心一言智能體詳細介紹和開發

一、前言 本期題目 開發方向:學習成長類 解讀: AI技術在學習成長方向的應用正日益增多,本期賽題需圍繞該方向開發智能體包括但不限于:作文輔導助手、個性化學習助手、考試助手、各垂類教育內容專家等 二、我的智能體:學業輔導…

macbook中foxmail的通訊錄遷移

之前windows中用習慣了foxmail,換成macbook后,還是沿用foxmail。使用一段時間后,確實受不了foxmail的不便:1、版本比較低1.5.6,很多windows新版的功能都沒有;2、動不動莫名其妙崩潰,寫了半天的郵件,點擊發送就直接崩了,又得重新寫。 忍耐了幾個月后,下定決心換成網易…

2.10 mysql設置遠程訪問權限

2.10 mysql設置遠程訪問權限 目錄1. 管理員運行mysql命令窗口2. 使用 root 用戶重新登錄 MySQL3. 修改用戶權限4. 修改mysql安裝目錄下的my.ini 目錄 說明: Mysql8.0 設置遠程訪問權限 一、Mysql8.0 設置遠程訪問權限 1. 管理員運行mysql命令窗口 2. 使用 root 用…

matlab安裝及破解

一、如何下載 軟件下載鏈接,密碼:98ai 本來我想自己生成一個永久百度網盤鏈接的,但是: 等不住了,所以大家就用上面的鏈接吧。 二、下載花絮 百度網盤下載速度比上載速度還慢,我給充了個會員&#xff0c…