成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

算法圖解:如何用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列?

開(kāi)發(fā) 前端 算法
隊(duì)列和棧是計(jì)算機(jī)中兩個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu),經(jīng)過(guò)前面的學(xué)習(xí)(《隊(duì)列》、《棧》)我們知道了它們各自的特點(diǎn),隊(duì)列是先進(jìn)先出(FIFO)的,而棧是先進(jìn)后出(FILO)的,那如何用棧來(lái)實(shí)現(xiàn)隊(duì)列呢?

[[348375]]

本文轉(zhuǎn)載自微信公眾號(hào)「Java中文社群」,作者磊哥 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java中文社群公眾號(hào)。 

本文已收錄至 https://github.com/vipstone/algorithm 《算法圖解》系列。

隊(duì)列和棧是計(jì)算機(jī)中兩個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu),經(jīng)過(guò)前面的學(xué)習(xí)(《隊(duì)列》、《棧》)我們知道了它們各自的特點(diǎn),隊(duì)列是先進(jìn)先出(FIFO)的,而棧是先進(jìn)后出(FILO)的,那如何用棧來(lái)實(shí)現(xiàn)隊(duì)列呢?這可是一道經(jīng)典的面試題,所以本文我們就來(lái)實(shí)現(xiàn)一下。

在正式開(kāi)始之前,我們先來(lái)回顧一下棧和隊(duì)列的常用方法。

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

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

 

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

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

 

有了這些前置知識(shí),接下來(lái)我們來(lái)看今天的題目。

題目描述

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

示例 1:

  1. 輸入: 
  2. ["CQueue","appendTail","deleteHead","deleteHead"
  3. [[],[3],[],[]] 
  4. 輸出:[null,null,3,-1] 

示例 2:

  1. 輸入: 
  2. ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"
  3. [[],[],[5],[2],[],[]] 
  4. 輸出:[null,-1,null,null,5,2] 

提示:

  1. 1 <= values <= 10000 
  2. 最多會(huì)對(duì) appendTail、deleteHead 進(jìn)行 10000 次調(diào)用 
  3. leetcode:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/ 

解題思路

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

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

步驟一

先將元素入棧到第一個(gè)棧中,如下圖所示:

 

步驟二

將第一個(gè)棧中的元素都移動(dòng)到第二個(gè)棧中,如下圖所示:


 

 

步驟三

所有元素從第二個(gè)棧中出棧,如下圖所示:

 

小結(jié)

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

 

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

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

  1. class CQueue { 
  2.     Stack<Integer> inputStack; // 入棧的容器(添加時(shí)操作) 
  3.     Stack<Integer> outputStack; // 出棧和查詢的棧容器 
  4.  
  5.     public CQueue() { 
  6.         inputStack = new Stack(); 
  7.         outputStack = new Stack(); 
  8.     } 
  9.  
  10.     // 添加操作 
  11.     public void appendTail(int value) { 
  12.         inputStack.push(value); 
  13.     } 
  14.  
  15.     // 刪除操作 
  16.     public int deleteHead() { 
  17.         if (!outputStack.isEmpty()) { 
  18.             // 出棧容器不為空 
  19.             return outputStack.pop(); 
  20.         } else if (!inputStack.isEmpty()) { 
  21.             // 入棧 stack 全部轉(zhuǎn)移到出棧 stack 
  22.             while (!inputStack.isEmpty()) { 
  23.                 outputStack.push(inputStack.pop()); 
  24.             } 
  25.         } 
  26.         return outputStack.isEmpty() ? -1 : outputStack.pop(); 
  27.     } 

我們?cè)?LeetCode 中提交以上測(cè)試代碼,執(zhí)行結(jié)果如下:

 

注意事項(xiàng)

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

第 1 個(gè)棧只負(fù)責(zé)入棧(暫存數(shù)據(jù)),第 2 個(gè)棧只負(fù)責(zé)出棧(最終的隊(duì)列執(zhí)行順序);

每次棧 2 出棧時(shí)都要把所有的元素都出完之后,才能從棧 1 中追加(添加)新數(shù)據(jù),當(dāng)棧 2 的數(shù)據(jù)沒(méi)有全部出棧完成時(shí),不能將棧 1 的元素入棧到棧 2,這樣會(huì)導(dǎo)致元素的執(zhí)行順序混亂。

總結(jié)

 

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

原文鏈接:https://mp.weixin.qq.com/s/18GdYCCaaltx4ZMVkPsptg

 

責(zé)任編輯:武曉燕 來(lái)源: Java中文社群
相關(guān)推薦

2021-09-08 09:52:34

語(yǔ)言

2023-02-26 01:37:57

goORM代碼

2017-08-21 09:38:30

2021-11-15 09:53:16

STM32PSPMSP

2016-09-06 19:45:18

javascriptVue前端

2024-02-02 08:25:34

隊(duì)列與棧Python數(shù)據(jù)結(jié)構(gòu)

2020-11-13 07:16:09

線程互斥鎖死循環(huán)

2017-03-20 17:59:19

JavaScript模板引擎

2017-03-15 08:43:29

JavaScript模板引擎

2012-06-05 13:18:58

容錯(cuò)服務(wù)器stratus

2021-09-13 06:03:42

CSS 技巧搜索引擎

2021-03-01 23:31:48

隊(duì)列實(shí)現(xiàn)棧存儲(chǔ)

2022-04-14 20:43:24

JavaScript原型鏈

2018-06-22 10:30:56

C語(yǔ)言虛擬機(jī)編譯器

2017-05-02 11:30:44

JavaScript數(shù)組惰性求值庫(kù)

2023-12-30 13:33:36

Python解析器JSON

2021-01-28 07:21:13

算法虛擬DOM前端

2021-08-03 08:13:47

數(shù)據(jù)

2018-03-23 10:00:34

PythonTensorFlow神經(jīng)網(wǎng)絡(luò)

2013-10-11 09:32:33

TD-LTELTE FDD4G
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品爱久久久久久久 | 婷婷综合色 | 国产一区二区三区视频免费观看 | 成人免费视频网站在线看 | 国产污视频在线 | 中文字幕不卡在线88 | 久久爱一区 | 国产精品视频在线播放 | 午夜视频一区 | 成人国产网站 | 欧美视频在线播放 | 免费观看一级特黄欧美大片 | 波多野结衣一区二区三区在线观看 | 看片91 | 国产婷婷综合 | 成人深夜福利 | 国产精品高潮呻吟久久久久 | 亚洲成人一区二区在线 | 热re99久久精品国99热观看 | 色综合色综合 | 精品国产一区二区三区久久久蜜月 | 国产精品久久九九 | 亚洲成人午夜电影 | 国内精品久久久久 | 精品国产免费一区二区三区五区 | 久久欧美高清二区三区 | 国产一区二区影院 | 毛片在线看片 | 久久国产电影 | 国产精品久久久久久久久久尿 | 九九免费视频 | 色婷婷婷婷色 | 中文字幕免费视频 | 国产免费又色又爽又黄在线观看 | 欧美老少妇一级特黄一片 | 日韩av啪啪网站大全免费观看 | 玩丰满女领导对白露脸hd | 日韩国产一区二区三区 | 三级黄色片在线播放 | 久久9热| 国产精品一区三区 |