數據結構與算法-Rust 版讀書筆記-2線性數據結構-隊列

數據結構與算法-Rust 版讀書筆記-2線性數據結構-隊列

1、隊列:先進先出

隊列是項的有序集合,其中,添加新項的一端稱為隊尾,移除項的另一端稱為隊首。一個元素在從隊尾進入隊列后,就會一直向隊首移動,直到它成為下一個需要移除的元素為止。

2、Rust 預備知識

1、Some

rust為了處理情況設置的兩個枚舉類型,分別是enum Option 和enum Result。

Option的枚舉情況有兩種,分別是代表有的Some()和代表無的None。 如果是有返回值,則可以通過if let,match,unwrap,?等多種方法對應情況取出Some包裹的值,如果沒有則是None。

Result的枚舉情況也是有兩種,表示正確的Ok()和表示錯誤的Err()。同樣也是match,unwrap等等對應方法去提取。分別提取對應情況的內容。

3、隊列的 Rust 代碼實現、運行結果

queue.rs

/** @Description: * @Author: tianyw* @Date: 2023-12-10 17:43:34* @LastEditTime: 2023-12-11 21:46:30* @LastEditors: tianyw*/
// 定義隊列
#[derive(Debug)] // Debug 是派生宏的名稱,此語句為 Queue 結構體實現了 Debug traitpub struct Queue<T> { // pub 表示公開的cap: usize, // 容量data: Vec<T>, // 數據容器
}impl<T> Queue<T> { // impl 用于定義類型的實現,如實現 new 方法、is_empty 方法等// 初始化空棧pub fn new(size: usize) -> Self { // 指代 Queue 類型Self {cap: size,data:Vec::with_capacity(size)}}pub fn is_empty(&self) -> bool {0 == Self::len(&self)}pub fn is_full(&self) -> bool {self.len() == self.cap}pub fn len(&self) -> usize { // &self 只可讀self.data.len()}// 清空pub fn clear(&mut self) { // &mut self 可讀、可寫self.data = Vec::with_capacity(self.cap)}// 判斷是否有剩余空間,如果有的話,就將數據添加到隊列中pub fn enquue(&mut self, val: T) -> Result<(), String> {if self.len() == self.cap {return  Err("No space available".to_string());}self.data.insert(0, val);Ok(())}// 數據出隊pub fn dequeue(&mut self) -> Option<T> {if self.len() > 0 {self.data.pop()}else {None}}// 以下是為隊列實現的迭代功能// into_iter:隊列改變,成為迭代器// iter: 隊列不變,得到不可變迭代器// iter_mut: 隊列不變,得到可變迭代器pub fn into_iter(self) -> IntoIter<T> {IntoIter(self)}pub fn iter(&self) -> Iter<T> {let mut iterator = Iter { stack: Vec::new() };for item in self.data.iter() {iterator.stack.push(item);}iterator}pub fn iter_mut(&mut self) -> IterMut<T> {let mut iterator = IterMut { stack: Vec::new() };for item in self.data.iter_mut() {iterator.stack.push(item);}iterator}}// 實現三種迭代功能
pub struct IntoIter<T>(Queue<T>);
impl<T:Clone> Iterator for IntoIter<T> {type Item = T;fn next(&mut self) -> Option<Self::Item> {if !self.0.is_empty() {Some(self.0.data.remove(0))} else {None}}
}pub struct Iter<'a,T:'a> { stack: Vec<&'a T>, }
impl<'a,T> Iterator for Iter<'a,T> {type Item = &'a T;fn next(&mut self) -> Option<Self::Item> {if 0 != self.stack.len() {Some(self.stack.remove(0)) // 索引移除}else {None}}
}pub struct IterMut<'a,T:'a> { stack: Vec<&'a mut T> }
impl<'a,T> Iterator for IterMut<'a,T> {type Item = &'a mut T;fn next(&mut self) -> Option<Self::Item> {if 0 != self.stack.len() {Some(self.stack.remove(0))}else {None}}
}    

main.rs

/** @Description: * @Author: tianyw* @Date: 2023-12-11 21:29:04* @LastEditTime: 2023-12-11 21:54:22* @LastEditors: tianyw*/mod queue;
fn main() {basic();iter();fn basic() {let mut q = queue::Queue::new(4);let _r1 = q.enquue(1);let _r2 = q.enquue(2);let _r3 = q.enquue(3);let _r4 = q.enquue(4); // 入隊if let Err(error) = q.enquue(5) {println!("Enqueue error:{error}")}if let Some(data) = q.dequeue() { // 出隊println!("dequeue data: {data}");}else {println!("empty queue");}println!("empty: {}, len: {}", q.is_empty(),q.len());println!("full: {}",q.is_full());println!("q: {:?}",q);q.clear();println!("{:?}",q);}fn iter() {let mut q = queue::Queue::new(4);let _r1 = q.enquue(1);let _r2 = q.enquue(2);let _r3 = q.enquue(3);let _r4 = q.enquue(4);let sum1 = q.iter().sum::<i32>();let mut addend = 0;for item in q.iter_mut() {*item += 1;addend += 1;}let sum2 = q.iter().sum::<i32>(); // vec 的 sum 方法println!("{sum1} + {addend} = {sum2}");println!("sum = {}",q.into_iter().sum::<i32>())}
}

cargo run 運行結果

在這里插入圖片描述

隊列的典型應用是模擬以FIFO方式管理數據的真實場景。

應用:燙手山芋游戲

// hot_potato.rsfn hot_potato(names: Vec<&str>, num: usize) -> &str {// 初始化隊列,將人名入隊let mut q = Queue::new(names.len());for name in names { let _nm = q.enqueue(name); }while q.size() > 1 {// 出入棧中的人名,相當于傳遞山芋for _i in 0..num {let name = q.dequeue().unwrap();let _rm = q.enqueue(name);}// 出入棧達到num次,刪除一個人名let _rm = q.dequeue();}q.dequeue().unwrap()
}fn main() {let name = vec!["Mon","Tom","Kew","Lisa","Marry","Bob"];let survivor = hot_potato(name, 8);println!("The survival person is {survivor}");// 輸出“The survival person is Marry”
}

注意,在上面的實現中,計數值8大于隊列中的人名數量6。但這不存在問題,因為隊列就像一個圈,到了隊尾就會重新回到隊首,直至達到計數值。

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

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

相關文章

鴻蒙原生應用再添新丁!同花順入局鴻蒙

鴻蒙原生應用再添新丁&#xff01;同花順入局鴻蒙 來自 HarmonyOS 微博12月11日消息&#xff0c;同花順已完成#鴻蒙原生應用#beta版本&#xff0c;并正在進行全量版本開發&#xff0c;進一步豐富了#鴻蒙原生應用#的覆蓋領域。同花順作為股民和券商首選的一站式金融理財服務平臺…

擴展學習|商業智能和分析:從大數據到大影響

文獻來源&#xff1a;Chen H, Chiang R H L, Storey V C. Business intelligence and analytics: From big data to big impact[J]. MIS quarterly, 2012: 1165-1188. 下載鏈接&#xff1a;https://pan.baidu.com/s/1JoHcTbwdc1TPGnwXsL4kIA 提取碼&#xff1a;a8uy 在不同的組…

MySQL忘記密碼

根據提供的引用內容&#xff0c;當使用root用戶登錄MySQL時&#xff0c;如果密碼錯誤&#xff0c;會出現"Access denied for user ‘root’‘localhost’ (using password: NO)"的錯誤提示。這個錯誤提示表示使用了錯誤的密碼或者沒有輸入密碼就嘗試登錄MySQL。解決這…

SQL命令---查看數據庫表

介紹 使用sql命令查看數據表。 命令 show create table 表名\G;\G&#xff1a;使顯示結果整齊美觀。

Vue-第七天

智慧商城項目&#xff1a; 1.創建項目選項&#xff1a; 2.調整&#xff1a; 主要是增加兩個文件夾&#xff0c;刪除倒是沒什么 3.組件庫&#xff08;vant-ui&#xff09;&#xff1a; 點擊進入官網:Vant 2 - Mobile UI Components built on Vue 4.導入&#xff1a; 全部導入…

MES系統需要具備哪些性能方面的需求?

MES系統需要具備哪些“性能需求”&#xff1f;關于這個問題&#xff0c;我覺得有必要先和大家解釋一下&#xff0c;到底什么是性能需求&#xff1f;性能需求在MES系統的作用是什么&#xff1f;講明白了這2點&#xff0c;問題自然而然就解決了。 什么是性能需求&#xff1f; 通…

選擇最適合您的數據集成工具

個人 對于個人而言&#xff0c;選擇最適合的數據集成工具可能會有一些不同的考量因素。以下是一些個人選擇數據集成工具時可能需要考慮的因素&#xff1a; 技術水平和經驗&#xff1a; 如果個人具有較深的技術水平和經驗&#xff0c;可能更傾向于選擇功能豐富、靈活性強的數據…

自編碼器 AutoEncoder

自編碼器&#xff08;AutoEncoder&#xff09;&#xff0c;也稱自編碼模型&#xff0c;是一種基于無監督學習的數據維度壓縮和特征表示方法&#xff0c;目的是對一組數據學習出一種表示。1986年 Rumelhart 提出自編碼模型用于高維復雜數據的降維。由于自動編碼器通常應用于無監…

《PySpark大數據分析實戰》-02.了解Hadoop

&#x1f4cb; 博主簡介 &#x1f496; 作者簡介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 熱衷于各種主流技術&#xff0c;熱愛數據科學、機器學習、云計算、人工智能。 通過了TiDB數據庫專員&#xff08;PCTA&#xff09;、TiDB數據庫專家&#xff08;PCTP…

Leetcode 2962. Count Subarrays Where Max Element Appears at Least K Times

Leetcode 2962. Count Subarrays Where Max Element Appears at Least K Times 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;2962. Count Subarrays Where Max Element Appears at Least K Times 1. 解題思路 這一題思路上同樣很直接&#xff0c;就是找到最大的元素所在的全…

云降水物理基礎

云降水物理基礎 云的分類 相對濕度變化方程 由相對濕度的定義&#xff0c;兩邊取對數之后可以推出 聯立克勞修斯-克拉佩龍方程&#xff08;L和R都為常數&#xff09; 由右式看出&#xff0c;增加相對濕度的方式&#xff1a;增加水汽&#xff08;de增大&#xff09;和降低…

開源好用EasyImages簡單圖床源碼

源碼介紹 開源好用EasyImages簡單圖床源碼分享&#xff0c;雖然它是開源程序&#xff0c;但功能一點也不弱&#xff0c;不僅支持多文件上傳、文字/圖片水印、支持API和鑒黃、還能自定義代碼&#xff0c;最重要的是它不強制使用數據庫運行&#xff0c;這就給我們的部署和維護帶…

人工智能的技術演進與未來趨勢

人工智能的技術演進與未來趨勢 一、引言 人工智能&#xff08;AI&#xff09;已經成為當今科技領域的熱門話題&#xff0c;其在各個行業的應用越來越廣泛。從智能語音助手到自動駕駛汽車&#xff0c;從智能家居系統到醫療診斷&#xff0c;AI技術已經深入到我們的日常生活。在…

OpenVINS學習2——VIRAL數據集eee01.bag運行

前言 周末休息了兩天&#xff0c;接著做上周五那個VIRAL數據集沒有運行成功的工作。現在的最新OpenVINS需要重新寫配置文件&#xff0c;不像之前那樣都寫在launch里&#xff0c;因此需要根據數據集情況配置好estimator_config.yaml還有兩個標定參數文件。 VIRAL數據集 VIRAL…

WooCommerce商城個人微信支付網關 適合個人微信收款

點擊獲取WooCommerce商城個人微信支付網關 適合個人微信收款原文https://gplwp.eastfu.com/product/woocommerce-ge-ren-wei-xin-zhi-fu-wang-guan-shi-he-ge-ren/ 個人微信支付網關接口&#xff0c;無需提現&#xff0c;100%資金安全&#xff0c;官方清算&#xff0c;金額無限…

壓力測試過程中出現線程死鎖情況如何解決

確認問題是線程死鎖的方法有以下幾種&#xff1a; 1. 分析日志&#xff1a;查看應用程序的日志&#xff0c;如果發現有線程死鎖的日志信息&#xff0c;可以確認問題是線程死鎖。 2. 使用線程分析工具&#xff1a;可以使用線程分析工具&#xff0c;例如Java的jstack工具&#xf…

axios的使用

Axios 是一個基于 promise 的 HTTP 庫&#xff0c;可以用在瀏覽器和 node.js 中。 如果您想在瀏覽器中使用 Axios&#xff0c;首先需要安裝它。您可以使用 npm&#xff08;Node 包管理器&#xff09;或 yarn 來安裝 Axios。例如&#xff0c;在命令行中輸入以下命令&#xff1a…

Docker 容器運行實戰:從啟動到停止一切你想知道的

要啟動一個新的容器&#xff0c;我們使用 docker run 命令&#xff0c;后跟鏡像名稱。基本語法如下&#xff1a; docker run [選項] 鏡像 [COMMAND] [ARG...] 例如&#xff0c;要運行官方的 Nginx 鏡像&#xff0c;我們可以使用&#xff1a; docker run -d -p 8080:80 nginx…

IoTDB服務安裝教程-集群版

文章目錄 官方說明文檔下載地址服務安裝節點服務分配修改配置文件修改堆內存啟動集群啟動第一個節點啟動其他兩個節點的 ConfigNode 和 DataNode檢驗集群狀態修改集群密碼 【附錄】清理環境 集群擴容修改配置擴容驗證擴容結果 集群縮容縮容一個 ConfigNode縮容一個 DataNode驗證…

XCube——用于超高分辨率 3D 形狀和場景的生成模型!

他們的方法在稀疏體素網格的層次結構上訓練潛在擴散模型的層次結構。他們在稀疏結構 VAE 的潛在空間上進行擴散&#xff0c;它為層次結構的每個級別學習緊湊的潛在表示。 XCube 是稀疏體素層次上的分層潛在擴散模型&#xff0c;即從粗到細的 3D 稀疏體素網格序列&#xff0c;使…