【數據結構】——棧和隊列OJ

一、有效的括號

題目鏈接:

20. 有效的括號 - 力扣(LeetCode)

題目的要求很簡單,就是要求我們判斷其輸入的括號字符串是否是有效的括號,那么我們要如何判斷呢?

我們可以這樣,我們遍歷出傳入的字符串,然后我們創建一個棧,然后如果這個字符是組左括號,那么我們就讓其入棧,然后如果是右括號,那么我們就取棧頂的元素和這個右括號進行對比,如果匹配那么就出棧,不匹配的話那么就說明這個字符串不是有效的括號,然后繼續進行比較,直到字符串遍歷完,那么我們字符串遍歷完后,是否就表示我們的這個括號是有效的呢?

并不是,我們還有一種情況,就是我們的字符串全是左括號,那么我們可以在最后進行判斷棧,如果棧不為空,那么就說明我們的字符串是無效的括號,那么我們要是為全是右括號的情況呢?

那么我們都是右括號的話,那么我們再取棧頂元素這里就會造成越界訪問了,所以我們再判斷到其字符不是左邊括號的時候,那么我們進入要其是右邊括號的情況,那么我們要先判斷棧內不為空才行。

那么我們可以將我們前面學習的棧的功能的代碼復制到oj平臺中,然后我們再寫題目中的函數。

二、用隊列實現棧

?題目鏈接:

225. 用隊列實現棧 - 力扣(LeetCode)

上面的題目也很好理解,就是要我們使用兩個隊列來實現棧的功能,我們經過前面的學習都知道我們的隊列是先進先出,棧是先進后出,隊列是一端進,另外一端出,然后棧是只能從棧頂入棧和出棧。其他的兩個是差不多的。那么我們改如何使用兩個隊列來實現棧的功能呢?我們主要是要想辦法將我們入隊列的數據可以反過來出隊列,不過我們發現其不要求我們出棧要在一個隊列,我們要兩個隊列進行配合。

例如我們現在要入1,2,3,4。四個數據,那么我們的入隊列的順序為1->2->3->4,我們現在希望其出隊列的順序為4->3->2->1,那么我們改如何實現呢?

我們可以這樣,我們每次要出棧都是要出的入隊列最晚的數據,那么我們可以這樣,我們每次入棧,都將其先入到一個非空的隊列中,然后我們要出棧的時候,那么我們就將從出隊列那一端的前size-1個數據按照?入隊列的順序,將其轉移到另外一個空隊列,那么我們要出棧就對原來那個隊列進行出棧,那么就可以實現我們的先進先出的功能了。

我們這里需要使用很多隊列的功能,那么我們將我們前面完成的隊列的功能的函數都復制到oj平臺上。

首先我們要先創建兩個隊列,題目中提供了這個結構體,那么我們在這個結構體中創建兩個隊列成員即可。

然后我們要對我們的兩個隊列進行初初始化:

下面我們就要對數據進行入棧,我們提到了,我們入棧的話是將數據存儲到非空的隊列中,那么我們直接進行判斷隊列是否為空,不為空我們就調用我們的入隊的函數即可。

然后就是我們的出棧了,我們出棧,實際上是出的非空隊列的隊尾的元素,那么我們就先將非空隊列的隊尾前面的元素移動到空隊列中,然后再出隊,那么就可以完成出棧了。

然后就到我們的取棧頂元素,其實就是我們當前不為空的隊列的隊尾的元素:

然后就是我們的判斷當前棧是否為空:那么我們就判斷兩個隊列即可,首先我們這個棧要為空的話,那么我們就需要兩個隊列都為空,那么我們就返回teur,那么就是我們的判隊列為空的函數,當隊列為空的時候能返回true,然后兩個要都為空,所以我們使用一個與邏輯即可。

然后就剩下我們的銷毀棧啦,那么我們直接調用我們銷毀隊列的函數,將兩個隊列進行銷毀,然后再將這個棧結構也銷毀即可。

?

三、用棧實現隊列

題目鏈接:232. 用棧實現隊列 - 力扣(LeetCode)?

上面我們是使用隊列實現棧,現在這個題目就要求我們使用棧實現隊列啦,那么我們要如何實現呢?

我們的棧是先進后出,隊列是先進先出,那么我們此時就要兩個棧進行配合,實現先進先出的功能,那么我們是否可以和上面隊列實現棧一樣呢?

基本的邏輯是一樣,還是兩個棧之間進行數據的倒,但是我們此時不是輪流進行倒了,我們是指定一個棧專門用來實現先進先出,那么具體是咋樣呢?

我們先將數據入第一個棧,然后我們就保留棧底的元素,然后我們就從棧頂開始出棧到另外一個棧,然后第一個棧就只有棧底的元素了,那么此時再出棧,此時的數據就是這個隊列出隊的數據,然后我們第二個棧,此時的棧底是原來棧頂的元素,那么我們此時就要將第二個棧倒回去,然后再重新進行上面的操作嗎?

其實不用,我們此時就可以直接對第二個棧進行出棧即可,因為此時我們的第二個棧的方向和一開始不同的了。

下面我們舉個例子來理解:

比如我們入第一個棧的順序為1->2->3->4,那么我們執行第一個操作后,我們的第二個棧從棧頂到棧底的順序為2->3->4,那么我們此時就直接按照順序進行出棧,那么就是我們的隊列啦,那么我們的邏輯就是,我們判斷第二個棧是否為空,如果不為空,那么我們就直接出棧,如果為空,那么我們就將專門用來入隊的棧,出棧到第二個棧中。

下面我們來實現一下:

首先我們將我們前面學習的棧的代碼進行拷貝復制一下,然后我們一步一步實現題目的要求。

我們題目第一個函數,要求實現隊列的初始化,我們就在函數中創建一個隊列,然后我們隊列結構體是由兩個棧組成的,然后我們對兩個棧初始化即可,那么我們就調用我們的棧初始化函數即可。

下面就是我們的入隊函數,我們就直接將數據入棧到pushST即可。

出隊我們上面將到了:

下面就是我們的取隊頭元素,其實就將pushST棧的元素移動到popST棧中,那么此時的棧頂的元素就是隊頭的元素了。

下面為判斷當前隊列是否為空,如果隊列為空那么就返回true,如果不為空就返回false。?

然后就是隊列的銷毀,那么我們就直接銷毀棧,然后銷毀這個隊列即可:

四、循環隊列?

題目鏈接:

622. 設計循環隊列 - 力扣(LeetCode)

?循環隊列是啥,題目已經講的很清楚啦,那么我們該如何進行循環呢?

我們題目提到我們的循環隊列是一種線性數據結構,那么我們就使用數組進行實現,那么我們創建一個循環隊列結構體,其中包括,一個數組,一個記錄我們隊頭的位置,一個記錄我們的隊尾,一個是我們的數組的有效容量。

然后我們數據的插入就從隊尾的位置插入,數據的刪除就從我們的對頭進行刪除,那么就實現了我們的先進先出。?

然后我們要如何判斷當前隊列是空,還是滿的呢?

空的情況我們很容易想到,就是我們的front==rear的時候,那么我們的隊列就為空的,那么滿的情況呢?我們走一遍循環就知道,當我們的rear走完一遍循環后,我們要對其進行取隊長的余數,然后raer就回到了0的位置,那么此時rear和front其實也還是相等的,那么咋辦呢?

我們可以創建capacity+1個空間,那么我們的隊列滿的情況就是(rear+1)*(capacity+1)==front的時候就為隊列滿的情況。

判斷是否為空:

判斷是否滿:

往循環隊列中插入數據:

?刪除循環隊列的元素:

取隊頭元素:

取隊尾元素,這里我們就要注意,就是我們的rear此時要是在我們的0的位置的時候,那么我們對其-1那么就變成-1了,那么就越界訪問了,所以我們要特殊處理:

?銷毀循環隊列:

?那么整體代碼如下:

?

運行結果:

?

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

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

相關文章

開源免費無廣告專注PDF編輯、修復和管理工具 辦公學術 救星工具

各位PDF處理小能手們!我跟你們說啊,今天要給大家介紹一款超牛的國產開源PDF處理工具,叫PDFPatcher,也叫PDF補丁丁。它就像一個PDF文檔的超級修理工,專門解決PDF編輯、修復和管理的各種難題。 這軟件的核心功能和特點&a…

【Bluedroid】藍牙 HID DEVICE 初始化流程源碼解析

本文深入剖析Android藍牙協議棧中HID設備(BT-HD)服務的初始化與啟用流程,從接口初始化、服務掩碼管理、服務請求路由到屬性回調通知,完整展現藍牙HID服務激活的技術路徑。通過代碼邏輯梳理,揭示服務啟用的核心機制&…

2025年項目管理軟件革命:中國技術主權與全球創新浪潮的交鋒

全球項目管理軟件市場正在經歷一場由多重技術疊加引發的結構性變革。根據Gartner最新預測,到2025年項目管理工具市場規模將突破220億美元,其中中國市場增速達38%,遠超全球平均水平。這場變革不僅關乎工具功能迭代,更深刻影響著企業…

計算機組成與體系結構:組相聯映射(Set-Associative Mapping)

目錄 🧩 映射方式問題回顧 🏗? 組相聯映射 工作流程 地址結構 ?? 替換策略 示例: 優點 ?? 與其他映射方式對比 🧩 映射方式問題回顧 直接映射的問題: 優點:實現簡單,查找速度快…

機器學習第八講:向量/矩陣 → 數據表格的數學表達,如Excel表格轉數字陣列

機器學習第八講:向量/矩陣 → 數據表格的數學表達,如Excel表格轉數字陣列 資料取自《零基礎學機器學習》。 查看總目錄:學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章:DeepSeek R1本地與線上滿血版部署:…

基于Spring AI實現多輪對話系統架構設計

文章目錄 基于Spring AI實現多輪對話系統架構設計 前言 一、多輪對話系統核心架構 1.1 架構概覽 1.2 Spring AI核心優勢 二、ChatClient與多輪對話設計 2.1 ChatClient的特性與角色 2.2 實現多輪對話方法 三、Advisors攔截器機制 3.1 Advisors概念與工作原理 3.2 對…

C++中的虛表和虛表指針的原理和示例

一、基本概念 1. 什么是虛函數(virtual function)? 虛函數是用 virtual 關鍵字修飾的成員函數,支持運行時多態(dynamic polymorphism)。通過基類指針或引用調用派生類重寫的函數。 class Base { public:…

FPGA:XILINX FPGA產品線以及器件選型建議

本文將詳細介紹Xilinx(現為AMD的一部分)當前的FPGA產品線及其主要特點,并提供器件選型的建議。以下內容基于Xilinx FPGA的最新信息,涵蓋產品系列、特性及選型指導。由于Xilinx已被AMD收購,產品線以AMD Xilinx品牌為主&…

【C++】多線程和多進程

在C++中,多線程通信(同一進程內的線程間交互)和進程間通信(IPC,不同進程間的數據交換)是構建并發系統的核心技術。以下是兩種通信機制的詳細介紹和典型實現: 一、多線程通信(線程間同步與數據共享) 1. 共享內存與同步原語 通過全局變量或對象成員變量實現數據共享,…

PC Cleaner軟件,它能幫助用戶輕松清理和優化電腦,提升系統性能。

不用破解就能用!這款超神的電腦清理 Pro 版,絕了! 寶子們,我是你們的數碼小助手藍木云!不知道大家有沒有這種感覺,電腦用久了,就像住久了沒打掃的屋子,越來越 “亂”,運…

linux中fork()函數的小問題

問題描述&#xff1a;分析下列代碼&#xff0c;分別能產生多少a // 1 for(int i0; i<3; i){ printf("a\n"); fork(); }// 2 for(int i0; i<3; i){ fork(); printf("a\n"); }// 3 for(int i0; i<3; i){ fork(); printf("a"); } fflus…

阿克曼-幻宇機器人系列教程2- 機器人交互實踐(Topic)

在上一篇文章中&#xff0c;我們介紹了兩種登錄機器人的方式&#xff0c;接下來我們介紹登錄機器人之后&#xff0c;我們如何通過topic操作命令實現與機器人的交互。 1. 啟動 & 獲取topic 在一個終端登錄樹莓派后&#xff0c;執行下列命令運行機器人 roslaunch huanyu_r…

51c嵌入式~電路~合集27

我自己的原文哦~ 一、7805應用電路 簡介 如上圖&#xff0c;7805 集成穩壓電路。 7805是串聯式三端穩壓器&#xff0c;三個端口分別是電壓輸入端&#xff08;IN&#xff09;&#xff0c;地線&#xff08;GND&#xff09;&#xff0c;穩壓輸出&#xff08;OUT&#xff09;…

Vitrualbox完美顯示系統界面(只需三步)

目錄 1.使用vitrualbox的增強功能&#xff1a;?編輯 2.安裝增強功能&#xff08;安裝完后要重啟虛擬機&#xff09;&#xff1a; 3. 調整界面尺寸&#xff08;如果一個選項不行的話&#xff0c;就多試試其他不同的百分比&#xff09;&#xff1a; 先看看原來的&#xff0c;…

2025年第十六屆藍橋杯軟件賽省賽C/C++大學A組個人解題

文章目錄 題目A題目C&#xff1a;抽獎題目D&#xff1a;紅黑樹題目E&#xff1a;黑客題目F&#xff1a;好串的數目 https://www.dotcpp.com/oj/train/1166/ 題目A 找到第2025個素數 #include <iostream> #include <vector> using namespace std; vector<i…

電機控制儲備知識學習(一) 電機驅動的本質分析以及與磁相關的使用場景

目錄 電機控制儲備知識學習&#xff08;一&#xff09;一、電機驅動的本質分析以及與磁相關的使用場景1&#xff09;電機為什么能夠旋轉2&#xff09;電磁原理的學習重要性 二、電磁學理論知識1&#xff09;磁場基礎知識2&#xff09;反電動勢的公式推導 附學習參考網址歡迎大家…

JMeter同步定時器 模擬多用戶并發訪問場景

同步定時器 JMter同步定時器的作用主要在于模擬多用戶并發訪問的場景&#xff0c;確保多個線程能夠同時執行某個操作&#xff0c;達到真正的并發效果。 當多個線程同時啟動時&#xff0c;它們可能會在不同的時間間隔內執行&#xff0c;這樣就無法達到真正的并發效果。&#xff…

C++11異步編程 --- async

C11異步編程 — async和future C11引入了async和future機制&#xff0c;用于簡化異步編程和并發操作。這兩個組件位于<future>頭文件中&#xff0c;提供了高級的異步任務管理接口。 一、async 1.定義 std::async std::async是一個函數模板&#xff0c;用于啟動一個異…

(七)深度學習---神經網絡原理與實現

分類問題回歸問題聚類問題各種復雜問題決策樹√線性回歸√K-means√神經網絡√邏輯回歸√嶺回歸密度聚類深度學習√集成學習√Lasso回歸譜聚類條件隨機場貝葉斯層次聚類隱馬爾可夫模型支持向量機高斯混合聚類LDA主題模型 一.神經網絡原理概述 二.神經網絡的訓練方法 三.基于Ker…

[Java實戰]Spring Boot 整合 Swagger2 (十六)

[Java實戰]Spring Boot 整合 Swagger2 &#xff08;十六&#xff09; 一、Swagger 的價值與痛點 為什么需要 API 文檔工具&#xff1f; 開發階段&#xff1a;前后端高效協作&#xff0c;實時驗證接口測試階段&#xff1a;提供標準化測試用例維護階段&#xff1a;降低新人理解…