亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
題目描述
解題思路
步驟一
步驟二
步驟三
小結(jié)
實(shí)現(xiàn)代碼
注意事項(xiàng)
總結(jié)
首頁 Java Java基礎(chǔ) 如何用兩個棧實(shí)現(xiàn)一個隊列?

如何用兩個棧實(shí)現(xiàn)一個隊列?

Oct 26, 2020 pm 05:54 PM
java 隊列

Java基礎(chǔ)教程欄目介紹如何用兩個棧實(shí)現(xiàn)一個隊列。

如何用兩個棧實(shí)現(xiàn)一個隊列?

隊列和棧是計算機(jī)中兩個非常重要的數(shù)據(jù)結(jié)構(gòu),經(jīng)過前面的學(xué)習(xí)(《隊列》、《?!罚┪覀冎懒怂鼈兏髯缘奶攸c(diǎn),隊列是先進(jìn)先出(FIFO)的,而棧是先進(jìn)后出(FILO)的,那如何用棧來實(shí)現(xiàn)隊列呢?這可是一道經(jīng)典的面試題,所以本文我們就來實(shí)現(xiàn)一下。

在正式開始之前,我們先來回顧一下棧和隊列的常用方法。

棧(Stack)的常用方法包含以下這些:

  • push():入棧方法,向棧頂添加元素;
  • pop():出棧方法,將棧頂?shù)脑匾瞥⒎祷卦兀?/li>
  • peek():查詢棧頂元素,并不會移除元素。

image.png

隊列(Queue)的常用方法包含以下這些:

  • offer():入隊方法,向隊尾添加元素;
  • poll():出隊方法,從隊頭移除并返回元素;
  • peek():查詢隊頭元素,并不會移除元素。

image.png有了這些前置知識,接下來我們來看今天的題目。

題目描述

用兩個棧實(shí)現(xiàn)一個隊列。隊列的聲明如下,請實(shí)現(xiàn)它的兩個函數(shù) appendTail 和 deleteHead,分別完成在隊列尾部插入整數(shù)和在隊列頭部刪除整數(shù)的功能,若隊列中沒有元素,deleteHead?操作返回 -1。

示例 1:

輸入:

["CQueue","appendTail","deleteHead","deleteHead"]

[[],[3],[],[]]

輸出:[null,null,3,-1]

示例 2:

輸入:

["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]

[[],[],[5],[2],[],[]]

輸出:[null,-1,null,null,5,2]

提示:

1 <= values <= 10000

最多會對 appendTail、deleteHead 進(jìn)行 10000 次調(diào)用

leetcode:leetcode-cn.com/problems/yo…

解題思路

這道題目的意思其實(shí)很好理解,就是要將先進(jìn)后出的棧改為先進(jìn)先出的隊列,其實(shí)問題中也給出了一些提示,“用兩個棧來實(shí)現(xiàn)一個隊列”。這道題實(shí)現(xiàn)的核心思想就是「負(fù)負(fù)得正」,我們先用一個棧來存入元素(這時最先進(jìn)入的元素在棧底),然后再將第一個棧中的元素移動到新棧中,此時最先進(jìn)入的元素就在棧頂了,然后在用第二個棧出棧時,整個執(zhí)行的順序就變成了先進(jìn)先出。

接下來,我們用圖解的方式來實(shí)現(xiàn)一下整個流程。

步驟一

先將元素入棧到第一個棧中,如下圖所示:image.png

步驟二

將第一個棧中的元素都移動到第二個棧中,如下圖所示:image.png

步驟三

所有元素從第二個棧中出棧,如下圖所示:image.png

小結(jié)

從上述圖片可以看出,元素添加順序是 1、2、3,最終經(jīng)過兩個棧之后的出棧順序也是 1、2、3,這樣我們就通過兩個棧實(shí)現(xiàn)了隊列(先進(jìn)先出)。image.png

實(shí)現(xiàn)代碼

接下來我們就用代碼來實(shí)現(xiàn)一下以上思路:

class CQueue {
    Stack?inputStack;?//?入棧的容器(添加時操作)
????Stack?outputStack;?//?出棧和查詢的棧容器

????public?CQueue()?{
????????inputStack?=?new?Stack();
????????outputStack?=?new?Stack();
????}????//?添加操作
????public?void?appendTail(int?value)?{
????????inputStack.push(value);
????}????//?刪除操作
????public?int?deleteHead()?{????????if?(!outputStack.isEmpty())?{????????????//?出棧容器不為空
????????????return?outputStack.pop();
????????}?else?if?(!inputStack.isEmpty())?{????????????//?入棧?stack?全部轉(zhuǎn)移到出棧?stack
????????????while?(!inputStack.isEmpty())?{
????????????????outputStack.push(inputStack.pop());
????????????}
????????}????????return?outputStack.isEmpty()???-1?:?outputStack.pop();
????}
}復(fù)制代碼

我們在 LeetCode 中提交以上測試代碼,執(zhí)行結(jié)果如下:image.png

注意事項(xiàng)

在整個實(shí)現(xiàn)過程中有兩個小細(xì)節(jié)需要特別注意一下:

  1. 第 1 個棧只負(fù)責(zé)入棧(暫存數(shù)據(jù)),第 2 個棧只負(fù)責(zé)出棧(最終的隊列執(zhí)行順序);
  2. 每次棧 2 出棧時都要把所有的元素都出完之后,才能從棧 1 中追加(添加)新數(shù)據(jù),當(dāng)棧 2 的數(shù)據(jù)沒有全部出棧完成時,不能將棧 1 的元素入棧到棧 2,這樣會導(dǎo)致元素的執(zhí)行順序混亂。

總結(jié)

本文我們通過兩個先進(jìn)后出的棧,通過“負(fù)負(fù)得正”的思路實(shí)現(xiàn)了隊列先進(jìn)先出的特性,但需要特別注意的是當(dāng)?shù)?2 個棧也就是出棧容器,在非空(棧)時不能將第 1 個棧中的元素添加到第 2 個棧中,以免造成程序執(zhí)行順序混亂。

相關(guān)免費(fèi)學(xué)習(xí)推薦:java基礎(chǔ)教程

以上是如何用兩個棧實(shí)現(xiàn)一個隊列?的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。JSON位置 VSCODE設(shè)置。JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位于用戶級或工作區(qū)級路徑,用于自定義VSCode設(shè)置。1.用戶級路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最后根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應(yīng)使用try-with-resources管理資源,妥善處理異常并關(guān)閉連接,避免連接泄漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,并保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日歷? 如何使用Java的日歷? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

了解網(wǎng)絡(luò)端口和防火墻 了解網(wǎng)絡(luò)端口和防火墻 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

See all articles