C語言每日一題(36)隊列實現棧功能

力扣 225 用隊列實現棧

題目描述

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

實現?MyStack?類:

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

思路分析

關于棧的功能,見于是基礎的數據結構,且如果知道隊列的功能也一定會知道棧的功能,這里不過多贅述,直接上思路

基于棧后進先出,而隊列先進先出的特點,我們可以定義兩個隊列,

這里先描述出棧的實現,假設一個隊列里已經放好了值,為1,2,3,4,按照隊列出隊的話,先取到1,但如果出棧的話,就需要取到4,這里另外一個隊列就派上用場了,我們可以將隊尾前的所有元素出隊,并進入到另一個隊列里,最后剩下的就是需要出棧的元素,此時我們在去原隊列的隊頭元素即可。

接下來到入棧的實現,關鍵在于應該入哪個隊,如果兩隊為空,隨便一個,但接下來的話如果要方便上述出棧的實現,我們就需要入隊到不為空的隊列。

緊接著是返回棧頂元素,我們已經知道,隊尾就是我們出棧的元素,所以這里直接返回隊列的隊尾元素即可。

判斷棧為空,直接檢測兩個隊列是否同時為空即可。

力扣不提供隊列的實現代碼,我們需要自己實現

完整代碼

隊列的實現代碼

typedef int QueueDataType;typedef struct QuNode
{QueueDataType data;struct QuNode* next;
}QuNode;typedef struct Queue
{QuNode* phead;QuNode* ptail;int size;
}Queue;// 初始化隊列
void QueueInit(Queue* q);
// 隊尾入隊列
void QueuePush(Queue* q, QueueDataType data);
// 隊頭出隊列
void QueuePop(Queue* q);
// 獲取隊列頭部元素
QueueDataType QueueFront(Queue* q);
// 獲取隊列隊尾元素
QueueDataType QueueBack(Queue* q);
// 獲取隊列中有效元素個數
int QueueSize(Queue* q);
// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0
int QueueEmpty(Queue* q);
//打印隊列
void QueuePrint(Queue* q);
// 銷毀隊列
void QueueDestroy(Queue* q);// 初始化隊列
void QueueInit(Queue* q)
{assert(q);q->phead = NULL;q->ptail = NULL;q->size = 0;
}
// 隊尾入隊列
void QueuePush(Queue* q, QueueDataType data)
{assert(q);//創建結點QuNode* newnode = (QuNode*)malloc(sizeof(QuNode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = data;newnode->next = NULL;//插入if (q->ptail == NULL){q->phead = q->ptail = newnode;}else{q->ptail->next = newnode;q->ptail = newnode;}q->size++;
}// 隊頭出隊列
void QueuePop(Queue* q)
{assert(q);assert(q->phead);QuNode* del = q->phead;q->phead = q->phead->next;free(del);del = NULL;if (q->phead == NULL){q->ptail = NULL;}q->size--;
}// 獲取隊列頭部元素
QueueDataType QueueFront(Queue* q)
{assert(q);assert(q->phead);return q->phead->data;
}
// 獲取隊列隊尾元素
QueueDataType QueueBack(Queue* q)
{assert(q);assert(q->ptail);return q->ptail->data;
}
// 獲取隊列中有效元素個數
int QueueSize(Queue* q)
{assert(q);return q->size;
}
// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0
int QueueEmpty(Queue* q)
{assert(q);if (q->phead == NULL){return 1;}else{return 0;}
}// 銷毀隊列
void QueueDestroy(Queue* q)
{assert(q);QuNode* cur = q->phead;while (cur){QuNode* next = cur->next;free(cur);cur = next;}q->phead = q->ptail = NULL;q->size = 0;
}//打印隊列
void QueuePrint(Queue* q)
{assert(q);QuNode* cur = q->phead;while (cur->next!=NULL){printf("%d ", cur->data);cur = cur->next;}
}

實現代碼

typedef struct {Queue q1;Queue q2;} MyStack;MyStack* myStackCreate() {MyStack* pst=(MyStack*)malloc(sizeof(MyStack));//動態創建棧QueueInit(&pst->q1);//棧初始化QueueInit(&pst->q2);return pst;
}void myStackPush(MyStack* pst, int x) {if(QueueEmpty(&pst->q1))//找出不為空的隊列將元素入隊{QueuePush(&pst->q2,x);}else{QueuePush(&pst->q1,x);}}int myStackPop(MyStack* pst) {Queue* empty=&pst->q1;//假設法,假設q1為空,后面再判斷一下結果,不對再反過來Queue* noneempty=&pst->q2;if(QueueEmpty(&pst->q2)){empty=&pst->q2;noneempty=&pst->q1;}while(QueueSize(noneempty)>1)//將出棧元素前的所有元素出隊,進入到空隊列中{QueuePush(empty,QueueFront(noneempty));QueuePop(noneempty);}int top=QueueFront(noneempty);//取到出棧元素QueuePop(noneempty);return top;}int myStackTop(MyStack* pst) {if(QueueEmpty(&pst->q1))//返回不為空隊列的隊尾元素{return QueueBack(&pst->q2);}else{return QueueBack(&pst->q1);}}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);obj=NULL;}

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

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

相關文章

vue2系列 — 自定義指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定義指令的鉤子 bind&#xff1a; 當 v-XXX 指令綁定到節點上時 觸發inserted&#xff1a;被綁定元素插入父節點時調用update&#xff1a;所在組件的 VNode 更新…

使用nprogress實現請求進度條

一、安裝nprogress npm i nprogress 二、 在axios的請求攔截器中使用nprogress 如果對于axios的請求和響應攔截器的使用不了解的&#xff0c;可以看這篇文章&#xff1a; axios二次封裝配置請求攔截器和響應攔截器-CSDN博客 nprogress上有兩個有用的方法&#xff1a; star(…

OpenStack云計算平臺-Dashboard(圖形化)

目錄 一、安裝和配置 1、安全并配置組件 2、完成安裝 ?二、驗證操作 一、安裝和配置 1、安全并配置組件 安裝軟件包&#xff1a; yum install openstack-dashboard 編輯文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

如何用Python爬取全國高校數據?

前言 Python是一門強大的編程語言&#xff0c;它可以用于爬取互聯網上的各種數據。在這篇文章中&#xff0c;我們將學習如何使用Python爬取全國高校數據&#xff0c;并使用代理IP進行爬取。 本文主要分為以下幾個部分&#xff1a; 數據來源及需求安裝依賴包及導入模塊爬取全…

關于禪道的安裝配置以及項目管理、團隊協同工作

目錄 一、禪道是什么&#xff1f; 二、特點和功能 三、安裝禪道 3.1 下載官網 3.2 版本考慮 3.3 禪道使用手冊參考 3.4 Windows端安裝禪道 四、啟動禪道 4.1 訪問禪道 四、禪道部分功能的使用 4.1 添加項目集 4.2 啟動/關閉項目 4.3 項目計劃儀表盤/階段目標/研發…

頭歌——操作系統實訓總結

死鎖 1、系統出現死鎖時一定同時保持了四個必要條件&#xff0c;對資源采用按序分配算法后可破壞的條件是&#xff08;A&#xff09;。 A、循環等待條件B、互斥條件C、占有并等待條件D、不可搶占條件 2、資源的靜態分配算法在解決死鎖問題中是用于&#xff08;B&#xff09;。 …

【圖論】關鍵路徑求法c++

代碼結構如下圖&#xff1a; 其中topologicalSort(float**, int, int*, bool*, int, int)用來遞歸求解拓撲排序&#xff0c;topologicalSort(float**, int*&, int, int, int)傳參圖的鄰接矩陣mat與結點個數n&#xff0c;與一個引用變量數組topo&#xff0c;返回一個布爾值…

代碼隨想錄-刷題第五天

鏈表題目總結 鏈表基本操作 對鏈表進行增刪改查等基本操作。注意&#xff0c;很多鏈表的題目使用虛擬頭結點操作起來會更加方便。每次對應頭結點的情況都要單獨處理&#xff0c;所以使用虛擬頭結點的技巧&#xff0c;就可以解決這個問題。 反轉鏈表 可以使用頭插法&#xf…

Shopee本土號封號幾率大嗎?如何避免封號?被封號了怎么辦?

Shopee是近幾年熱門的電商平臺之一&#xff0c;即使越來越多的跨境電商涌現&#xff0c;他的地位在東南亞市場依然占據一席之地&#xff0c;也依舊吸引著需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被關停之后&#xff0c;留下了大片空白&#xff0c;Shope…

CF 1890A Doremy‘s Paint 3 學習筆記 map的使用

原題 A. Doremys Paint 3 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output An array &#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45b;&#xfffd;1,&#xfffd;2,…,&#xfffd;&a…

跨境電商必須要海外代理IP嗎?盤點五大海外代理IP

相信跨境電商人近日都為了2023的跨境黑五旺季奮戰&#xff0c;而2024也即將來臨&#xff0c;對于跨境人的考驗一波接著一波&#xff0c;根據Adobe Analytics的數據&#xff0c;2022年黑色星期五的銷售額創下91.2億美元新高&#xff0c;網絡星期的銷售額同樣達到創紀錄的113億美…

『 C++類與對象 』多態之單繼承與多繼承的虛函數表

文章目錄 &#x1fae7; 前言&#x1fae7; 查看虛表&#x1fae7; 單繼承下的虛函數表&#x1fae7; 多繼承下的虛函數表 &#x1fae7; 前言 多態是一種基于繼承關系的語法,既然涉及到繼承,而繼承的方式有多種: 單繼承多繼承棱形繼承棱形虛擬繼承 不同的繼承方式其虛表的形…

ToDesk提示通道限制 - 解決方案

問題 使用ToDesk進行遠程控制時&#xff0c;免費個人賬號最多支持1個設備同時發起遠控&#xff0c;若使用此賬號同時在2個設備發起遠控&#xff0c;則會提示通道限制&#xff0c;如下圖&#xff1a; 解決方案 方案1&#xff1a;斷開其它遠控 出現通道限制彈窗時&#xff0…

數據結構(超詳細講解!!)第二十四節 二叉樹(下)

1.遍歷二叉樹 在二叉樹的一些應用中&#xff0c;常常要求在樹中查找具有某種特征的結點&#xff0c;或者對樹中全部結點逐一進行某種處理。這就引入了遍歷二叉樹的問題&#xff0c;即如何按某條搜索路徑訪問樹中的每一個結點&#xff0c;使得每一個結點僅且僅被訪問一次。 …

python3實現tailf命令

由于windows上面沒有類似linux上面的tailf命令&#xff0c;所以下面的python腳本來代替其能力。 tailf.py import re import timeimport os import argparsedef follow(thefile):thefile.seek(0, os.SEEK_END)while True:_line thefile.readline()if not _line:time.sleep(0…

RabbitMQ 搭建和工作模式

MQ基本概念 1. MQ概述 MQ全稱 Message Queue&#xff08;[kju?]&#xff09;&#xff08;消息隊列&#xff09;&#xff0c;是在消息的傳輸過程中保存消息的容器。多用于分布式系統之間進行通信。 &#xff08;隊列是一種容器&#xff0c;用于存放數據的都是容器&#xff0…

docker部署微服務

目錄 docker操作命令 鏡像操作命令 拉取鏡像 導出鏡像 刪除鏡像 加載鏡像 推送鏡像 部署 pom文件加上 在每個模塊根目錄加上DockerFile文件 項目根目錄加上docker-compose.yml文件 打包&#xff0c;clean&#xff0c;package 服務器上新建文件夾 測試docker-compo…

基于springboot和微信小程序的流浪動物管理系統

基于springboot和微信小程序的流浪動物管理系統 內容簡介 基于微信小程序實現的流浪動物管理系統&#xff0c;該系統針對用戶與管理員兩種角色進行開發。 1、提供流浪動物的信息查詢功能&#xff0c;包括品種、年齡、性別、健康狀況等&#xff0c;提供救助活動報名功能。 2…

5.1 PBR基礎 BRDF介紹

基于物理的渲染&#xff08;Physically Based Rendering&#xff0c;PBR&#xff09;是指使用基于物理原理和微平面理論建模的著色/光照模型&#xff0c;以及使用從現實中測量的表面參數來準確表示真實世界材質的渲染理念。 一、反射率方程 理論基礎放在參考鏈接里。 直接開始…

【uniapp】uniapp開發小程序定制uni-collapse(折疊面板)

需求 最近在做小程序&#xff0c;有一個類似折疊面板的ui控件&#xff0c;效果大概是這樣 代碼 因為項目使用的是uniapp&#xff0c;所以打算去找uniapp的擴展組件&#xff0c;果然給我找到了這個叫uni-collapse的組件&#xff08;鏈接&#xff1a;uni-collapse&#xff09…