【數據結構】隊列OJ題《用隊列實現棧》(題庫+解析+代碼)

1.前言?

通過前面隊列的實現和詳解大家對隊列應該有一定熟悉了,現在上強度開始做題吧

隊列詳解:http://t.csdnimg.cn/dvTsW

2.OJ題目訓練225. 用隊列實現棧

題目分析

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

實現?MyStack?類:

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

注意:

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

顧名思義,題目很好理解,那么該如何用隊列實現棧呢,單純用一個隊列,那完全是不可能實現棧的,那么我們就要思考如果多一個隊列可不可以實現:

方法

如圖是兩個隊列和一個棧按順序放入數據(1,2,3,4)

如果要實現棧,那么我們第一個拿出的數據就應該是4(后進先出),而如果是隊列,第一個拿出的數據則是1(先進先出)

所以我們應該利用好q2(第二個隊列)來實現棧相同的效果,實現可以把除4(最后放入隊列的數),其他數均放置入q2。

再把q1的4給輸出,就能達到棧的效果了

最后輸出q1滯空,這樣實現一個空隊列,一個非空隊列來進行不斷的交換傳輸數據

注意要點

  1. 本題目需要借助原本以寫過的代碼來進行完成,所以請優先查看本文頭部的隊列教學
  2. 兩個隊列應該明確好:空隊列輸入數據,非空輸出數據

附源代碼

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue		//由于每次操作的函數都需要傳遞頭和尾指針,所以直接封裝更方便
{QNode* head;QNode* tail;int size;
}Que;void QueueInit(Que* pq);
void QueueDestroy(Que* pq);
void QueuePush(Que* pq, QDataType x);
void QueuePop(Que* pq);
QDataType QueueFront(Que* pq);
QDataType QueueBack(Que* pq);
bool QueueEmpty(Que* pg);
int QueueSize(Que* pg);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)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;if (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(!QueueEmpty(pq));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--;
}
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;}
bool QueueEmpty(Que* pq)
{assert(pq);return pq->head == NULL;}
int QueueSize(Que* pq)
{assert(pq);return pq->size;
}typedef struct {Que q1;Que q2;
} MyStack;MyStack* myStackCreate() {MyStack * pst = (MyStack*)malloc(sizeof(MyStack));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) 
{Que* empty = &obj->q1;Que* nonEmpty = &obj->q2;if(!QueueEmpty(&obj->q1)){empty = &obj->q2;nonEmpty = &obj->q1;}while(QueueSize(nonEmpty)>1)    //把非空隊列的對頭導入空隊列{QueuePush(empty,QueueFront(nonEmpty));  //將非空的隊列值轉移到空隊列中QueuePop(nonEmpty);}int top = QueueFront(nonEmpty); //取出頭數據再刪除QueuePop(nonEmpty);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);
}/*** Your MyStack struct will be instantiated and called as such:* MyStack* obj = myStackCreate();* myStackPush(obj, x);* int param_2 = myStackPop(obj);* int param_3 = myStackTop(obj);* bool param_4 = myStackEmpty(obj);* myStackFree(obj);
*/

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

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

相關文章

git 設置代理 取消代理

設置代理 git config --global http.proxy 127.0.0.1:7890 git config --global https.proxy 127.0.0.1:7890注意&#xff1a;加上 --global 是對 git 設置全局代理&#xff0c;不加 --global 對指定倉庫目錄設置代理&#xff0c;局部代理 查看已修改 git 配置信息 git conf…

【GPU驅動開發】- AST簡介

前言 不必害怕未知&#xff0c;無需恐懼犯錯&#xff0c;做一個Creator&#xff01; AST&#xff0c;抽象語法樹&#xff0c;是一種包含豐富語義信息的格式&#xff0c;其中包括類型、表達式樹和符號等。 TranslationUnitDecl&#xff1a;該類表示一個輸入源文件 ASTContext&…

Qt注冊類對象單例與單類型區別

1.實現類型SingletonTypeExample #ifndef SINGLETONTYPEEXAMPLE_H #define SINGLETONTYPEEXAMPLE_H#include <QObject>class SingletonTypeExample : public QObject {Q_OBJECT public://只能顯示構造類對象explicit SingletonTypeExample(QObject *parent nullptr);//…

【學習筆記】深度學習實戰 | LeNet

簡要聲明 學習相關網址 [雙語字幕]吳恩達深度學習deeplearning.aiPapers With CodeDatasets 深度學習網絡基于PyTorch學習架構&#xff0c;代碼測試可跑。本學習筆記單純是為了能對學到的內容有更深入的理解&#xff0c;如果有錯誤的地方&#xff0c;懇請包容和指正。 參考文獻…

KubeEdge 邊緣計算

文章目錄 1.KubeEdge2.KubeEdge 特點3.KubeEdge 組成4.KubeEdge 架構 KubeEdge # KubeEdgehttps://iothub.org.cn/docs/kubeedge/ https://iothub.org.cn/docs/kubeedge/kubeedge-summary/1.KubeEdge KubeEdge 是一個開源的系統&#xff0c;可將本機容器化應用編排和管理擴展…

藍牙耳機和筆記本電腦配對連接上了,播放設備里沒有顯示藍牙耳機這個設備,選不了輸出設備

環境&#xff1a; WIN10 雜牌藍牙耳機6s 問題描述&#xff1a; 藍牙耳機和筆記本電腦配對連接上了&#xff0c;播放設備里沒有顯示藍牙耳機這個設備&#xff0c;選不了輸出設備 解決方案&#xff1a; 1.打開設備和打印機&#xff0c;找到這個設備 2.選中這個設備&#…

Linux下gcc編譯常用命令詳解

在Linux環境下&#xff0c;使用gcc編譯器進行源代碼的編譯是程序員日常工作的一部分。本篇將介紹一些常用的gcc編譯命令&#xff0c;幫助開發者更好地理解和使用這些命令。 1. 基本編譯命令 gcc工作流程&#xff1a; 編譯單個源文件 gcc source.c -o output這個命令將sour…

20240229筆記

瀏覽器預加載器 手動&#xff1a;prefetch preload <link rel"prefetch" href"next.html"> <link rel"preload" as"style" href"styles.css"> <link rel"preload" as"javascript" hr…

調試工具vue,react,redux

React Developer Tools Redux DevTools Vue devtools 使用瀏覽器官方組件擴展搜索安裝

C語言練習:(力扣645)錯誤的集合

題目鏈接&#xff1a;645. 錯誤的集合 - 力扣&#xff08;LeetCode&#xff09; 集合 s 包含從 1 到 n 的整數。不幸的是&#xff0c;因為數據錯誤&#xff0c;導致集合里面某一個數字復制了成了集合里面的另外一個數字的值&#xff0c;導致集合 丟失了一個數字 并且 有一個數字…

枚舉和聯合(共用體)

目錄 枚舉枚舉類型的定義枚舉的優點 聯合&#xff08;共用體&#xff09;聯合類型的定義聯合的特點聯合大小的計算 枚舉 枚舉顧名思義就是一一列舉&#xff0c;把可能的取值一一列舉 枚舉類型的定義 enum Day &#xff0c; enum Sex &#xff0c;enum Color 都是枚舉類型{}中…

springboot生成圖片驗證碼(借鑒并分析)

目錄 一、CaptchaUtil代碼展示二、CaptchaController 代碼展示 一、CaptchaUtil代碼展示 package com.minster.yanapi.utils;import com.google.code.kaptcha.impl.DefaultKaptcha;import com.google.code.kaptcha.util.Config; import org.springframework.context.annotatio…

MMDetection3D v1.3.0安裝教程

MMDetection3D v1.3.0安裝教程 1. 系統環境2. 安裝2.1 基本環境安裝2.2 調整具體版本2.3 驗證2.4 安裝MinkowskiEngine和TorchSparse 3. 最終環境配置 根據 v1.3.0版本官方手冊測試后的安裝配置&#xff0c;親測可行。 1. 系統環境 項目版本日期Ubuntu18.04.06 LTS-顯卡RTX 2…

曾桂華:車載座艙音頻體驗探究與思考| 演講嘉賓公布

智能車載音頻 I 分論壇將于3月27日同期舉辦&#xff01; 我們正站在一個前所未有的科技革新的交匯點上&#xff0c;重塑我們出行體驗的變革正在悄然發生。當人工智能的磅礴力量與車載音頻相交融&#xff0c;智慧、便捷與未來的探索之旅正式揚帆起航。 在駕駛的旅途中&#xff0…

安裝 Distribution Registry

Distribution Registry是由容器部署&#xff0c;所有前提是需要安裝docker 參考文檔&#xff1a;https://docs.docker.com/engine/install/centos/ Registry 官網文檔 https://distribution.github.io/distribution/ 安裝Registry倉庫 docker run -d -p 5000:5000 --restartalw…

通過css修改video標簽的原生樣式

通過css修改video標簽的原生樣式 描述實現結果 描述 修改video標簽的原生樣式 實現 在控制臺中打開設置&#xff0c;勾選顯示用戶代理 shadow DOM&#xff0c;就可以審查video標簽的內部樣式了 箭頭處標出來的就是shodow DOM的內容&#xff0c;這些內容正常不可見的&#x…

MySQL 用了哪種默認隔離級別,實現原理是什么?

MySQL 的默認隔離級別是 RR - 可重復讀&#xff0c;可以通過命令來查看 MySQL 中的默認隔離級別。 RR - 可重復讀是基于多版本并發控制&#xff08;Multi-Version Concurrency Control&#xff0c;MVCC &#xff09;實現的。MVCC&#xff0c;在讀取數據時通過一種類似快照的方…

視覺三維重建colmap框架的現狀與未來

注&#xff1a;該文章首發3D視覺工坊&#xff0c;鏈接如下3D視覺工坊 前言 眾所周知&#xff0c;三維重建的發展已經進入了穩定期&#xff0c;尤其是離線方案的發展幾乎處于停滯期&#xff0c;在各大論刊上也很少見到傳統sfmmvs亮眼的文章。這也不難理解&#xff0c;傳統的多視…

MYSQL 解釋器小記

解釋器的結果通常通過上述表格展示&#xff1a; 1. select_type 表示查詢的類型 simple: 表示簡單的選擇查詢&#xff0c;沒有子查詢或連接操作 primary:表示主查詢&#xff0c;通常是最外層的查詢 subquery :表示子查詢&#xff0c;在主查詢中嵌套的查詢 derived: 表示派…

【王道數據結構】【chapter8排序】【P360t2】

試編寫一個算法&#xff0c;使之能夠在數組L[1……n]中找出第k小的元素&#xff08;即從小到大排序后處于第k個位置的元素&#xff09;&#xff08;可以直接采用排序&#xff0c;但下面的排序的代碼只是為了方便核對是不是第k小的元素&#xff0c;k從0開始計算&#xff09; #in…