(一)棧結構、隊列結構

01-線性結構-數組-棧結構

線性結構(Linear List)是由n(n>=0)個數據元素(結點) a[0], a[1], a[2], a[3],...,a[n-1]組成的有限序列

數組

通常數組的內存是連續的,所以在知道數組下標的情況下,訪問效率是非常高的

可在數組的任意位置插入和刪除數據

棧結構

簡介

  • 是一種受限的線性結構,先進后出
  • 僅允許在表的一端進行插入和刪除運算,即棧頂;另一端為棧底。
  • 必須按照順序來進出棧

習題練習

題目

有六個元素6,5,4,3,2,1的順序進棧,問下列哪一個不是合法的出棧序列?(C

A. 5 4 3 6 1 2 B. 4 5 3 2 1 6 C. 3 4 6 5 2 1 D. 2 3 4 1 5 6

答案解析:

A:65進棧,5出棧,4進棧出棧,3進棧出棧,6出棧,21進棧,1出棧,2出棧

B:654進棧,4出棧,5出棧,3進棧出棧,2進棧出棧,1進棧出棧,6出棧

D:65432進棧,2出棧,3出棧,4出棧,1進棧出棧,5出棧,6出棧

實現棧結構

// 封裝一個棧
class ArrayStack {// 定義一個數組/鏈表。用于存儲數據private data: any[] = []// 實現棧中相關的操作方法// 1.push方法:將一個元素壓入到棧中push(element: any):void {this.data.push(element)}// 2.pop方法:將棧頂的元素彈出棧(返回出去,并且移除該項)pop():any {return this.data.pop()}// 3peek方法:看一眼棧頂元素,但是不進行任何操作peek(): any {return this.data[this.data.length - 1]}// 4.isEmpty:判斷棧是否為空isEmpty(): boolean {return this.data.length === 0}// 5.size:返回棧的數據個數size(): number {return this.data.length}
}

對上述代碼進行測試:

// 創建stack實例
const stack1 = new ArrayStack()
stack1.push("aaa")
stack1.push("bbb")
stack1.push("ccc")console.log(stack1.peek());//ccc
console.log(stack1.pop());//ccc
console.log(stack1.pop());//bbb
console.log(stack1.pop());//aaaconsole.log(stack1.isEmpty());//true
console.log(stack1.size());//0

相關應用

十進制轉二進制
import ArrayStack from "./02-實現棧結構Stacks(重構)"function decimalToBinary(decimal: number): string {// 1.創建一個棧,用于存放余數const stack = new ArrayStack<number>()/* 2.使用循環 // while:不確定次數,只知道循環結束跳轉// for:知道循環的次數*/while(decimal > 0) {const result = decimal % 2stack.push(result)decimal = Math.floor(decimal / 2)}//  3.所有的余數都已經放在stack中,依次取出即可let binary = ''while(!stack.isEmpty()) {binary += stack.pop()}return binary
}console.log(decimalToBinary(35));//100011
console.log(decimalToBinary(100));//1100100
有效的括號

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

給定一個只包括 '('')''{''}''['']' 的字符串 s ,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。
  3. 每個右括號都有一個對應的相同類型的左括號。

解題:

import ArrayStack from "./02-實現棧結構Stacks(重構)"function isValid(s:string): boolean {// 1.創建一個棧結構const stack = new ArrayStack<string>()// 2.變量s中的所有括號for(let i = 0; i < s.length; i++) {const c = s[i]switch(c) {case "(":stack.push(")")breakcase "{":stack.push("}")breakcase "[":stack.push("]")breakdefault:if(c !== stack.pop()) return falsebreak}}return stack.isEmpty()
}console.log(isValid("()"));
console.log(isValid("()[]{}["));

02-隊列結構-面試題

  • 隊列(queue)是一種先進先出的線性結構
  • 數據元素按照順序依次進入隊列,最先進入的元素最先離開隊列
  • 類似于現實中的排隊場景,比如排隊買票,先到的人先離開隊列
  • 常見的隊列結構

實現隊列結構

1.定義隊列結構接口

interface IQueue<T> {// 入隊方法enqueue(element: T): void// 出隊方法dequeue(): T | undefined// peek 方法peek(): T | undefined// 判斷是否為空isEmpty(): boolean// 元素個數size(): number
}export default IQueue

2.實現隊列結構

import IQueue from "./IQueue"
class ArrayQueue<T> implements IQueue<T> {// 內部通過數組或鏈表保存數據private data: T[] = []enqueue(element: T): void {this.data.push(element)}dequeue(): T | undefined {return this.data.shift()}peek(): T | undefined {return this.data[0]}isEmpty(): boolean {return this.data.length === 0}size(): number {return this.data.length}
}export default ArrayQueue

3.測試代碼:

import ArrayQueue from "./01-實現隊列結構";const queue = new ArrayQueue<number>()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
console.log(queue.dequeue());//1
console.log(queue.dequeue());//2
console.log(queue.size());//1

擊鼓傳花

要求:一群人圍成一圈,獲取最后剩下的人位置或名字

import ArrayQueue from "./01-實現隊列結構"
function hotPotatao (names:string[],num:number) {if(names.length === 0) return -1// 創建隊列結構const queue = new ArrayQueue<string>()// 2.將所有name入隊操作for (const name of names) {queue.enqueue(name)}// 3.淘汰的規則while(queue.size()>1){// 1、2淘汰for(let i = 1;i<num; i++) {const name = queue.dequeue()if(name) queue.enqueue(name)}// 3淘汰queue.dequeue()}// return queue.dequeue()const Leftname = queue.dequeue()!// 拿到當前名字的索引return names.indexOf(Leftname)
}const leftName = hotPotatao(["張三","李四","王五","趙六","錢七"],3)
console.log(leftName);

約瑟夫環

0,1,...,n-1個數字圍城一個圈,從數字0開始,每次刪除圓圈中第m個數字(刪除后從下一個數字計數)。求該圓圈剩下的最后一個數字。

import ArrayQueue from "./01-實現隊列結構"
function lastRemaining(n:number,m:number) {// 輸入參數校驗if (n <= 0 || m <= 0) {throw new Error("參數 n 和 m 必須大于 0");}// 1.創建隊列const queue = new ArrayQueue<number>()// 2.將所有數組加入到隊列中for (let i = 0; i < n; i++) {queue.enqueue(i)}// 3.判斷隊列中是否還有數字while(queue.size()>1) {for(let i = 1; i<m; i++) {queue.enqueue(queue.dequeue()!)}queue.dequeue()}return queue.dequeue()!
}console.log(lastRemaining(5,3));//3console.log(lastRemaining(10,17));//2

動態規劃思想實現:

function lastRemainingOptimized(n: number, m: number): number {if (n <= 0 || m <= 0) {throw new Error("參數 n 和 m 必須大于 0");}let result = 0;for (let i = 2; i <= n; i++) {result = (result + m) % i;}return result;
}// 測試用例
console.log(lastRemainingOptimized(5, 3)); // 輸出: 3
console.log(lastRemainingOptimized(10, 17)); // 輸出: 2

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

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

相關文章

【學Rust寫CAD】35 alpha_mul_256(alpha256.rs補充方法)

源碼 // Calculates (value * alpha256) / 255 in range [0,256], // for [0,255] value and [0,256] alpha256. pub fn alpha_mul_256(self,value: u32) -> Alpha256 {let prod value * self.0;Alpha256((prod (prod >> 8)) >> 8) }代碼分析 這個函數 alph…

C# 與 相機連接

一、通過組件連接相機 需要提前在VisionPro里面保存一個CogAcqFifoTool相機工具為 .vpp 定義一個相機工具 CogAcqFifoTool mAcq null;將保存的相機工具放入mAcq中 string path “C:\Acq.vpp”; mAcq (CogAcqFifoTool)CogSerializer.LoadObjectFrommFile(path);給窗口相機…

Java并發編程高頻面試題

一、基礎概念 1. 并行與并發的區別&#xff1f; 并行&#xff1a;多個任務在多個CPU核心上同時執行&#xff08;物理上同時&#xff09;。并發&#xff1a;多個任務在單CPU核心上交替執行&#xff08;邏輯上同時&#xff09;。類比&#xff1a;并行是多個窗口同時服務&#x…

LiT and Lean: Distilling Listwise Rerankers intoEncoder-Decoder Models

文章&#xff1a;ECIR 2025會議 一、動機 背景&#xff1a;利用LLMs強大的能力&#xff0c;將一個查詢&#xff08;query&#xff09;和一組候選段落作為輸入&#xff0c;整體考慮這些段落的相關性&#xff0c;并對它們進行排序。 先前的研究基礎上進行擴展 [14,15]&#xff0c…

Python高級爬蟲之JS逆向+安卓逆向1.2節: 變量與對象

目錄 引言&#xff1a; 1.2.1 Python中的變量 1.2.2 變量的命名與可讀性 1.2.3 Python中的對象 1.2.4 跟大神學高級爬蟲安卓逆向 引言&#xff1a; 大神薯條老師的高級爬蟲安卓逆向教程&#xff1a; 這套爬蟲教程會系統講解爬蟲的初級&#xff0c;中級&#xff0c;高級知…

可發1區的超級創新思路(python 實現):一種輕量化的動態稀疏門控網絡

首先聲明,該模型為原創!原創!原創!且該思路還未有成果發表,感興趣的小伙伴可以借鑒! 一、應用領域 視頻異常檢測、生成視頻檢測。 二、模型解析 該模型由1.關鍵幀動態選擇機制、2.關鍵幀動態選擇機制以及3.關鍵幀動態選擇機制三大核心組件構成,形成端到端的視頻異常…

使用NVM下載Node.js管理多版本

提示&#xff1a;我解決這個bug跟別人思路可能不太一樣&#xff0c;因為我是之前好用&#xff0c;換個項目就不好使了&#xff0c;倦了 文章目錄 前言項目場景一項目場景二解決方案&#xff1a;下載 nvm安裝 nvm重新下載所需Node 版本nvm常用命令 項目結構說明 前言 提示&…

MySQL數據庫經典面試題解析

1. MySQL 索引使用有哪些注意事項呢? 可以從三個維度回答這個問題:索引哪些情況會失效,索引不適合哪些場景,索引規則 索引哪些情況會失效 查詢條件包含or,可能導致索引失效如何字段類型是字符串,where時一定用引號括起來,否則索引失效like通配符可能導致索引失效。聯合…

C#結合SQLite數據庫使用方法

一、關于SQLite SQLite 是一個輕量級的嵌入式關系型數據庫管理系統&#xff08;RDBMS&#xff09;。與傳統的數據庫管理系統&#xff08;如 MySQL、PostgreSQL 或 SQL Server&#xff09;不同&#xff0c;SQLite 并不需要運行單獨的服務器進程&#xff0c;它的數據庫存儲在一個…

深入解析 MySQL 中的日期時間函數:DATE_FORMAT 與時間查詢優化

深入解析 MySQL 中的日期時間函數&#xff1a;DATE_FORMAT 與時間查詢優化 在數據庫管理和應用開發中&#xff0c;日期和時間的處理是不可或缺的一部分。MySQL 提供了多種日期和時間函數來滿足不同的需求&#xff0c;其中DATE_FORMAT函數以其強大的日期格式化能力&#xff0c;…

如何深刻理解Reactor和Proactor

前言&#xff1a; 網絡框架的設計離不開 I/O 線程模型&#xff0c;線程模型的優劣直接決定了系統的吞吐量、可擴展性、安全性等。目前主流的網絡框架&#xff0c;在網絡 IO 處理層面幾乎都采用了I/O 多路復用方案(又以epoll為主)&#xff0c;這是服務端應對高并發的性能利器。 …

筆試專題(七)

文章目錄 乒乓球筐&#xff08;哈希&#xff09;題解代碼 組隊競賽題解代碼 刪除相鄰數字的最大分數&#xff08;線性dp&#xff09;題解代碼 乒乓球筐&#xff08;哈希&#xff09; 題目鏈接 題解 1. 兩個哈希表 先統計第一個字符串中的字符個數&#xff0c;再統計第二個字…

清晰易懂的 Flutter 卸載和清理教程

以下是為 Flutter 徹底卸載與清理教程&#xff0c;覆蓋 Windows、macOS、Linux 系統&#xff0c;步驟清晰無殘留&#xff0c;確保完全刪除 Flutter SDK、依賴工具及 IDE 配置。 一、通用步驟&#xff1a;確認 Flutter 安裝方式 Flutter 通常通過以下方式安裝&#xff1a; 手動…

關于反卷積

&#x1f9e0; 什么是反卷積&#xff1f; 反卷積&#xff08;Deconvolution&#xff09;&#xff0c;通常也稱為轉置卷積&#xff08;Transpose Convolution&#xff09;&#xff0c;是一種用于擴展輸入特征圖的操作&#xff0c;通常用于生成圖像或上采樣任務中。與標準卷積操…

【機器學習】ROC 曲線與 PR 曲線

目錄 一、混淆矩陣&#xff1a;分類評估的基礎 二. ROC 曲線 (Receiver Operating Characteristic Curve) 三. PR 曲線 (Precision-Recall Curve) 3.1 核心思想 4. 何時使用 ROC 曲線和 PR 曲線&#xff1f; 實驗結果 6. 總結 在機器學習的分類任務中&#xff0c;我們訓…

Python高階函數-map

map() 是 Python 內置的一個高階函數&#xff0c;它接收一個函數和一個可迭代對象作為參數&#xff0c;將函數依次作用在可迭代對象的每個元素上&#xff0c;并返回一個迭代器&#xff08;Python 3.x 中&#xff09;。 基本語法 map(function, iterable, ...)function: 應用于…

上海餐飲市場數據分析與可視化

上海作為中國的經濟中心和國際化大都市,其餐飲市場具有高度的多樣性和競爭性。隨著消費者需求的不斷變化,餐飲行業的從業者和投資者需要深入了解市場現狀和趨勢,以便制定更有效的商業策略。本文將通過數據分析和可視化技術,深入探討上海餐飲市場的現狀和趨勢,為餐飲從業者…

MySQL基礎 [五] - 表的增刪查改

目錄 Create&#xff08;insert&#xff09; Retrieve&#xff08;select&#xff09; where條件 ?編輯 NULL的查詢 結果排序(order by) 篩選分頁結果 (limit) Update Delete 刪除表 截斷表&#xff08;truncate&#xff09; 插入查詢結果&#xff08;insertselect&…

SQL:Primary Key(主鍵)和Foreign Key(外鍵)

目錄 1. Key&#xff08;鍵&#xff09; 2. Index&#xff08;索引&#xff09; 3.Key和Index的區別 4. Primary Key&#xff08;主鍵&#xff09; 5. Foreign Key&#xff08;外鍵&#xff09; 6.主鍵和外鍵的關系 溫馨提示&#xff1a; 閃電按鈕不同的執行功能 首先&…

2025年- H1-Lc109-160. 相交列表--java版

1.題目描述 2.思路 “雙指針切換鏈表頭” 思路一&#xff1a;雙指針路徑對齊 while (pA ! pB) { pA (pA null) ? headB : pA.next; pB (pB null) ? headA : pB.next; } 讓兩個指針走相同的總路徑長度&#xff01; 設&#xff1a; 鏈表 A 獨有部分長度是 lenA 鏈表 B …