數據結構(3.5)——隊列的順序實現

隊列的順序實現

#define MaxSize 10//定義隊列中元素的最大個數
typedef struct {int data[MaxSize];//用靜態數組存放隊列元素int front, rear;//隊頭指針和隊尾指針
} SqQueue;void testQueue() {SqQueue Q;//聲明一個隊列(順序存儲)
}

隊列的初始化操作和判空

//初始化隊列
void InitQueue(SqQueue& Q) {//初始時 隊頭、隊尾指針指向0Q->rear = Q->front = 0;
}
//判斷隊列是否為空
bool QueueEmpty(SqQueue Q) {if (q.rear == Q.front) {//判空條件return true;}else {return false;}
}

循環隊列——入隊操作

以下情況我們重點先考慮尾指針指向隊尾元素的后一位情況

隊列的入隊操作只能從隊尾入隊(插入)

//入隊
bool EnQueue(SqQueue& Q, int x) {if (Q.rear + 1) % MaxSize == Q.front){//判斷隊滿return false;//隊滿報錯}else {Q.data[Q.rear] = x;//新元素插入隊尾Q.rear = (Q.rear + 1) % MaxSize;//隊尾指針加1取模,隊尾指針后移return true;}
}

該函數中的

		Q.rear = (Q.rear + 1) % MaxSize;//隊尾指針加1取模

這一行代碼實則是將一個順序隊列變成了循環隊列

循環隊列——入隊操作

//出隊(刪除一個隊頭元素,并用x返回)
bool DeQueue(SqQueue& Q, int& x) {if (Q.rear == Q.front) {//判斷隊空return false;//隊空則報錯}else {x = Q.data[Q.front];Q.front = (Q.front + 1) & MaxSize;//隊頭指針后移return true;}
}

循環隊列——讀取隊頭操作

讀取隊頭的操作和出隊操作很類似,只是將表格引用符號去掉,并且不要讓隊頭指針往后移就行

//獲得隊頭元素的值,用x返回
bool GetHead(SqQueue Q, int& x) {if (Q.rear == Q.front) {//判斷隊空return false;//隊空則報錯}else {x = Q.data[Q.front];return true;}
}
void testQueue() {SqQueue Q;//聲明一個隊列(順序存儲)
}

計算隊列元素個數:

(rear+MaxSize-front)%MaxSize

方法二:增加一個輔助變量size判斷空判滿

由于剛剛第一種方法判空和判滿會造成一些不必要的內存空間浪費,于是我們在隊列中添加一個size來表示隊列的長度,并且記錄隊列的入隊和出隊變化

typedef struct {int data[MaxSize];//用靜態數組存放隊列元素int front,rear;//隊頭指針和隊尾指針int size;//隊列當前長度
} SqQueue;
//初始化隊列
void InitQueue(SqQueue& Q) {//初始時 隊頭、隊尾指針指向0Q.rear = Q.front = 0;Q.size=0;
}

方法三:增加一個輔助變量tag判斷空判滿?

#define MaxSize 10//定義隊列中元素的最大個數
typedef struct {int data[MaxSize];//用靜態數組存放隊列元素int front,rear;//隊頭指針和隊尾指針int tag;//最近進行的是刪除為0/插入為1
} SqQueue;

例子:

// 初始化隊列
void InitQueue(SqQueue *Q) {Q->front = Q->rear = 0;Q->tag = 0;
}// 判斷隊列是否為空
int IsEmpty(SqQueue Q) {return Q.front == Q.rear && Q.tag == 0;
}// 判斷隊列是否已滿
int IsFull(SqQueue Q) {return Q.front == Q.rear && Q.tag == 1;
}// 入隊操作
int EnQueue(SqQueue *Q, int x) {if (IsFull(*Q)) {return 0; // 隊列已滿,入隊失敗}Q->data[Q->rear] = x;Q->rear = (Q->rear + 1) % MaxSize; // 循環使用數組Q->tag = 1;return 1; // 入隊成功
}// 出隊操作
int DeQueue(SqQueue *Q, int *x) {if (IsEmpty(*Q)) {return 0; // 隊列為空,出隊失敗}*x = Q->data[Q->front];Q->front = (Q->front + 1) % MaxSize; // 循環使用數組Q->tag = 0;return 1; // 出隊成功
}

?總結:

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

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

相關文章

大模型面試題目

1.為什么需要做位置編碼 位置編碼(Positional Encoding)在變換器(Transformer)模型中非常重要,因為變換器架構本身沒有內置的順序信息。變換器使用的是自注意力機制,它能夠捕捉輸入序列中所有詞之間的相關性…

論文解析——Transformer 模型壓縮算法研究及硬件加速器實現

作者及發刊詳情 鄧晗珂,華南理工大學 摘要 正文 實驗平臺 選取模型: T r a n s f o r m e r b a s e Transformer_{base} Transformerbase? 訓練數據集:WMT-2014 英語-德語翻譯數據集、IWSLT-2014 英語-德語互譯數據集 Transformer模…

JVM垃圾回收性能調優實戰指南

JVM垃圾回收性能調優實戰指南 一、引言 在Java應用程序中,垃圾回收(Garbage Collection, GC)是自動管理內存的重要機制。然而,不恰當的垃圾回收配置可能導致性能瓶頸,如頻繁的GC暫停、內存碎片過多等。因此&#xff…

kpatch制作內核熱補丁步驟總結

零、原理及參考 kpatch入門實踐教程-CSDN博客 Kpatch 使用過程及其原理-CSDN博客 一、準備工作 安裝對應版本的kpatch-build.rpm并解決依賴diff -Naur dir1 dir2 > hot.patch 拿到補丁文件下載對應內核版本的src.rpm安裝好對應的開發包kernel-debuginfo,kern…

從GPT-1到GPT-3 預訓練語言模型的演進與突破

本文由 ChatMoney團隊出品 前言 Generative Pre-trained Transformer(GPT)系列是由OpenAI開發的預訓練語言模型,它們在多種NLP任務中取得了令人矚目的成績,包括文章生成、代碼生成、機器翻譯和問答等。GPT系列模型的核心思想是通…

數據庫開發:mysql基礎一

文章目錄 數據庫開發Day15:MySQL基礎(一)一、MySQL介紹與安裝【1】MySQL介紹(5)啟動MySQL服務(6)修改root登陸密碼 二、SQL簡介三、數據庫操作四、數據表操作4.1、數據庫數據類型4.2、創建數據表…

對標 GPT-4o 的開源實時語音多模態模型:Moshi

是由法國的 AI 實驗室 Kyutai 推出的實時語音多模態模型,支持聽、說、看,最關鍵的是你現在就可以在瀏覽器中使用,如果這個鏈接延遲高,可以試試這個, 無需輸入郵箱,點擊 Join queue 即可。 簡單體驗了下,比…

#### golang中【堆】的使用及底層 ####

聲明,本文部分內容摘自: Go: 深入理解堆實現及應用-騰訊云開發者社區-騰訊云 數組實現堆 | WXue 堆(Heap)是實現優先隊列的數據結構,Go提供了接口和方法來操作堆。 應用 package mainimport ("container/heap&q…

結構方程模型-驗證性因子分析模型

初級 第7講 驗證性因子分析模_嗶哩嗶哩_bilibili

使用 ESP32 接收來自 MAX4466 模擬麥克風模塊的數據,并通過 DAC 輸出模擬音頻信號,可以通過以下步驟實現:

硬件準備 ESP32 開發板MAX4466 模擬麥克風模塊揚聲器或耳機接線 MAX4466 模塊輸出(AO) -> ESP32 ADC 引腳(如 GPIO 34)ESP32 DAC 引腳(如 GPIO 25 或 GPIO 26) -> 揚聲器或耳機軟件準備 音頻采集DAC 轉碼并播放代碼實現 以下代碼展示了如何從 MAX4466 讀取模擬音頻…

【Go語言入門學習筆記】Part7.閉包和defer關鍵字

一、前言 閉包有點像對象,而defer適合于類似功能中利用資源時,提前寫幾句defer 釋放資源,防止后面釋放資源忘記寫釋放資源。 二、學習代碼 package mainimport ("fmt" )// getC的返回值是一個函數,需要的參數為空&…

GitHub Pull Request流程詳解

GitHub Pull Request流程詳解 在協作開發中,GitHub的Pull Request(PR)功能至關重要,它允許開發者在代碼庫中進行修改、審查和合并代碼。本文將詳細介紹GitHub Pull Request的完整流程,幫助你更好地理解和使用這一強大…

網絡安全的十字路口:向“架構化”轉移

市場條件正在快速變化 針對上述這些問題,在這段時間里,安全技術供應商推出了許多技術解決方案,比如SIEM、SOAR、XDR、UEBA等,但新產品的推出并未使得安全態勢有所好轉,許多問題依然存在,這導致了市場動態的…

【DevOps】Java內存分配與JVM參數詳解

目錄 引言 JVM內存結構 JVM參數概述 堆內存分配 年輕代與老年代 調整堆內存大小 調整年輕代與老年代比例 元空間分配 調整元空間大小 垃圾回收 調整GC參數 調整GC日志 線程棧分配 調整線程棧大小 性能調優 結論 在Java開發中,理解Java虛擬機&#x…

claude3.5寫作——《基于灰色預測的中國人口數量預測》

文章目錄 站點和提問引言一、灰色預測模型介紹二、中國歷年人口數據三、灰色預測模型的建立1.建立原始序列2.生成1-AGO序列3.計算背景值4.構造數據矩陣并計算參數5.模型檢驗6.模型預測 四、預測結果分析五、政策建議結語參考文獻 站點和提問 站點:中國官方克勞德3.…

如何更改 Python pip 源為國內源

在使用 Python 安裝包工具 pip 時,經常會遇到下載速度慢的問題。這通常是因為默認使用的官方源 https://pypi.org/simple 在國內訪問速度較慢。為了提高下載速度,我們可以將 pip 源更改為國內的鏡像源。本文將介紹如何臨時和永久地更改 pip 源為國內源。…

光伏電站數據采集方案(基于工業路由器部署)

? 一、方案概述 本方案采用星創易聯SR500工業路由器作為核心網關設備,實現對光伏電站現場數據的實時采集、安全傳輸和遠程監控。SR500具備多接口、多功能、高可靠性等特點,能夠滿足光伏電站數據采集的各種需求。(key-iot.com/iotlist/sr500…

RK3568平臺(opencv篇)ubuntu18.04上安裝opencv環境

一.什么是 OpenCV-Python OpenCV-Python 是一個 Python 綁定庫,旨在解決計算機視覺問題。 ? Python 是一種由 Guido van Rossum 開發的通用編程語言,它很快就變得非常流行,主要是 因為它的簡單性和代碼可讀性。它使程序員能夠用更少的代碼行…

C++ 運算符的優先級和關聯性表

C 運算符的優先級和關聯性表 1. Precedence and associativity (優先級和結合性)2. Alternative spellings (替代拼寫)3. C operator precedence and associativity table (C 運算符的優先級和關聯性表)References C documentation (C 文檔) https://learn.microsoft.com/en-us…

網絡IO模型之多路復用器.md

多路復用是什么?怎么理解? 本文主要涉及為 程序中處理網絡IO時的模型,對于系統內核而言網絡IO模型。這里只做普及使用 前置知識,什么是IO?怎么理解IO IO其實就是In和Out。中文翻譯是輸入和輸出,只要涉及到輸…