用c語言實現——順序隊列支持用戶輸入交互、入隊、出隊、查找、遍歷、計算隊列長度等功能。確定判斷判滿的方法為:犧牲一個存儲單元方式

一、知識介紹

1.基本原理

在順序隊列中,我們使用一個固定大小的數組來存儲隊列中的元素,并使用兩個指針(frontrear)來分別表示隊頭和隊尾的位置。

  1. 隊列為空的條件front == rear

  2. 隊列滿的條件rear + 1 ≡ front (mod MAX_SIZE)

為了區分“隊列滿”和“隊列空”的情況,我們犧牲一個存儲單元,即當隊尾指針的下一個位置(循環計算)等于隊頭指針時,認為隊列已滿,而不是等到隊列完全填滿。?

2.實現方法?

a.數據結構

b.判空和判滿

  • 判空front == rear

  • 判滿(rear + 1) % MAX_SIZE == fron

c.入隊操作

當隊列未滿時,將元素添加到隊尾,并更新隊尾指針:

d.出隊操作

當隊列非空時,移除隊頭元素,并更新隊頭指針:

二、關鍵點解析

1.判斷隊列是否已滿邏輯解析

?核心邏輯:

隊列滿的條件是:隊尾指針的下一個位置(循環計算)等于隊頭指針。換句話說,當 (rear + 1) % MAX_SIZE == front 時,隊列已滿。

為什么這樣判斷?

  • 循環隊列的特性:隊列使用一個固定大小的數組來存儲元素,并通過 frontrear 指針來管理元素的插入和刪除。

  • 犧牲一個存儲單元:為了區分“隊列滿”和“隊列空”的情況,我們犧牲一個存儲單元。
    rear + 1 等于 front 時,認為隊列已滿,而不是等到隊列完全填滿。

假設 MAX_SIZE = 5,隊列的數組大小為 5。
情況 1:隊列滿:
front = 0
rear = 4
(4 + 1) % 5 = 0,等于 front,所以隊列滿。
情況 2:隊列未滿
front = 0
rear = 3
(3 + 1) % 5 = 4,不等于 front,所以隊列未滿。

2. 入隊邏輯

a. 判斷隊列是否已滿

調用 IsFull 函數判斷隊列是否已滿。

如果隊列已滿,打印提示信息并返回 false,表示入隊失敗。

b.入隊操作

?將元素 value 存入隊列的尾部位置(q->rear)。

c.更新隊尾指針

隊尾指針 rear 加 1,并對數組大小 MAX_SIZE 取模,是為了確保指針在數組范圍內循環。

d.?返回成功?

3.出隊邏輯

a.函數定義

返回值類型:bool,表示出隊操作是否成功。

參數:

SeqQueue *q:指向隊列的指針。

int *value:指向一個整型變量的指針,用于存儲出隊的元素值。

b.判斷隊列是否為空

調用 IsEmpty 函數判斷隊列是否為空。

如果隊列為空,打印提示信息并返回 false,表示出隊失敗。

c.獲取隊頭元素

將隊列中隊頭位置(q->front)的元素值賦給傳入的指針變量 *value

  • q->data 是存儲隊列元素的數組。

  • q->front 是隊頭指針,指向當前隊列的第一個元素的位置。

  • q->data[q->front] 通過數組索引訪問隊頭元素。

  • *value 是一個指針解引用操作,將隊頭元素的值存儲到傳入的變量中。

d.更新隊頭指針

隊頭指針 front 加 1,并對數組大小 MAX_SIZE 取模,確保指針在數組范圍內循環。

4.查找元素

a.檢查隊列是否為空

調用 IsEmpty 函數判斷隊列是否為空。

如果隊列為空,打印提示信息并返回 -1,表示無法查找。

b.?初始化變量

index:初始化為隊頭指針 front,用于遍歷隊列。

count:初始化為0,用于記錄當前遍歷到的位置。

c.?遍歷隊列

循環條件:index != q->rear,表示隊列中還有元素未遍歷。

查找邏輯:

? ? ? ?如果當前索引位置的元素等于要查找的值,返回 count,從0開始表示找到了元素。

? ? ? ?如果未找到,更新 index 指針為下一個位置,并對數組大小 MAX_SIZE 取模,確保指針在數組范圍內循環。

? ?count 加1,記錄當前遍歷到的位置。

d.未找到元素

如果循環結束仍未找到元素,返回 -1

5.遍歷邏輯

a.檢查隊列是否為空

調用 IsEmpty 函數判斷隊列是否為空。

如果隊列為空,打印提示信息并返回,表示無法遍歷。

b.打印隊列元素并遍歷

打印提示信息,表示接下來將輸出隊列中的元素。

初始化索引index 初始化為隊頭指針 front,用于遍歷隊列。

循環條件index != q->rear,表示隊列中還有元素未遍歷。

打印元素:通過 q->data[index] 訪問當前索引位置的元素并打印。

更新索引index = (index + 1) % MAX_SIZE,更新索引為下一個位置,并對數組大小 MAX_SIZE 取模,確保指針在數組范圍內循環。

打印換行符,使輸出更整潔。

6.計算長度邏輯

a.為什么可以這樣計算?

1.?直接計算?rear - front

在非循環隊列中,隊列的長度可以直接通過 rear - front 計算。例如:

  • 如果 front = 0rear = 3,隊列長度為 3 - 0 = 3

  • 如果 front = 1rear = 4,隊列長度為 4 - 1 = 3

2.?循環隊列的特殊情況

在循環隊列中,rear 可能小于 front,因為隊列是循環的。例如:

  • 如果 front = 3rear = 0,直接計算 rear - front 會得到負數 -3,這顯然不符合實際隊列長度。

3.?解決負數問題

為了避免負數,公式中加上了 MAX_SIZE

這樣可以確保結果始終是正數。例如:

  • 如果 front = 3rear = 0MAX_SIZE = 5

    • 0 - 3 + 5 = 2,表示隊列中有 2 個元素。

4.?取模操作

這一步確保即使 rearfront 的差值超過 MAX_SIZE,結果仍然正確

假設 MAX_SIZE = 5

情況 1:rear?大于?front
  • front = 0

  • rear = 3

  • 計算:(3 - 0 + 5) % 5 = 8 % 5 = 3,隊列長度為 3。

情況 2:rear?小于?front
  • front = 3

  • rear = 0

  • 計算:(0 - 3 + 5) % 5 = 2 % 5 = 2,隊列長度為 2。

情況 3:隊列為空
  • front = 0

  • rear = 0

  • 計算:(0 - 0 + 5) % 5 = 5 % 5 = 0,隊列長度為 0。

三、完整代碼

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>#define MAX_SIZE 10                              // 隊列的最大容量                      // 定義隊列結構
typedef struct
{int data[MAX_SIZE];                          // 存儲隊列元素的數組             int front;                                   // 隊頭指針int rear;                                    // 隊尾指針
}SeqQueue;// 初始化隊列
void InitQueue(SeqQueue* q)
{q->front = 0;q->rear = 0;
}// 判斷隊列是否已滿
bool isFull(SeqQueue* q)
{return ((q->rear + 1) % MAX_SIZE) == q->front;
}// 判斷隊列是否為空
bool isEmpty(SeqQueue* q)
{return	q->front == q->rear;
}// 入隊操作
bool Enqueue(SeqQueue* q, int value)
{if (isFull(q)){printf("隊列已滿,無法入隊!\n");return false;}q->data[q->rear] = value;q->rear = (q->rear + 1) % MAX_SIZE;return true;
}// 出隊操作
bool Dequeue(SeqQueue* q, int* value)
{if (isEmpty(q)){printf("隊列為空,無法出隊!\n");return false;}*value = q->data[q->front];q->front = (q->front + 1) % MAX_SIZE;return true;
}// 查找元素
int FindElement(SeqQueue* q, int value)
{if (isEmpty(q)){printf("隊列為空,無法查找!\n");return -1;}int index = q->front;int count = 1;while (index != q->rear){if (q->data[index] == value){return count;                         // 返回元素在隊列中的位置(從0開始)}index = (index + 1) % MAX_SIZE;count++;}return -1;
}// 遍歷隊列
void TraverseQueue(SeqQueue* q)
{if (isEmpty(q)){printf("隊列為空,無法遍歷!\n");return;}printf("隊列元素:");int index = q->front;while (index != q->rear){printf("%d ", q->data[index]);index = (index + 1) % MAX_SIZE;}printf("\n");
}// 計算隊列長度
int QueueLength(SeqQueue* q)
{return ((q->rear) - (q->front) + MAX_SIZE) % MAX_SIZE;
}void Menu()
{printf("\n===== 順序隊列操作菜單 =====\n");printf("1. 入隊\n");printf("2. 出隊\n");printf("3. 查找元素\n");printf("4. 遍歷隊列\n");printf("5. 計算隊列長度\n");printf("0. 退出程序\n");printf("請輸入您的選擇:");
}int main()
{SeqQueue queue;InitQueue(&queue);int choice = 0;int value = 0;int pos = 0;while (1){Menu();scanf_s("%d", &choice);switch (choice){case 1:printf("請輸入要入隊的元素:>");scanf_s("%d", &value);if (Enqueue(&queue, value)){printf("入隊成功!當前隊列長度:>%d\n", QueueLength(&queue));}break;case 2:if (Dequeue(&queue, &value)){printf("出隊元素:%d,當前隊列長度:%d\n", value, QueueLength(&queue));}break;case 3:printf("請輸入要查找的元素:");scanf_s("%d", &value);pos = FindElement(&queue, value);if (pos != -1){printf("元素 %d 在隊列中的位置為:%d\n", value, pos);}else{printf("隊列中不存在元素 %d\n", value);}break;case 4:TraverseQueue(&queue);break;case 5:printf("當前隊列長度:%d\n", QueueLength(&queue));break;case 0:printf("程序結束!\n");exit(0);break;default:printf("無效的選擇,請重新輸入!\n");}}return 0;
}

?以上是基于VS2022編譯器,用c語言實現——順序隊列。判斷隊列已滿或者空的情況是通過犧牲一個存儲單元的方法來實現的。支持用戶輸入交互、入隊、出隊、查找、遍歷等功能。

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

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

相關文章

JVM 系列:JVM 內存結構深度解析

你點贊了嗎&#xff1f;你關注了嗎&#xff1f;每天分享干貨好文。 高并發解決方案與架構設計。 海量數據存儲和性能優化。 通用框架/組件設計與封裝。 如何設計合適的技術架構&#xff1f; 如何成功轉型架構設計與技術管理&#xff1f; 在競爭激烈的大環境下&#xff0c…

手機上的APN是什么,該怎么設置

網上說改個APN就可以讓網速快幾倍&#xff0c;那到底APN是個什么東西&#xff0c;真的能讓網速快幾倍嗎&#xff1f; APN的作用 網絡連接基礎&#xff1a;APN&#xff08;接入點名稱&#xff09;是手機連接移動網絡的“橋梁”&#xff0c;負責識別運營商網絡類型&#xff08;…

微服務治理與可觀測性

服務注冊與發現 核心功能 服務實例動態變化&#xff1a;實例可能因擴縮容、故障或遷移導致IP變動。服務依賴解耦&#xff1a;調用方無需硬編碼服務地址&#xff0c;降低耦合度。負載均衡&#xff1a;自動選擇健康實例&#xff0c;提升系統可用性。 核心組件 服務注冊中心&am…

嵌入式linux系統中內存管理的方法與實現

第一:linux內核管理詳解圖形 第二:Linux內存管理詳細分析 深入剖析Linux內核內存管理 作為嵌入式系統開發者,理解Linux內核的內存管理對于開發高效、穩定的系統至關重要。在這篇文章中,我們將詳細解析Linux內核如何劃分物理內存和虛擬內存,頁表、MMU(內存管理單元)與TL…

【dataframe顯示不全問題】打開一個行列超多的excel轉成df之后行列顯示不全

出現問題如下圖&#xff1a; 解決方案&#xff5e; display.width解決列顯示不全 pd.set_option(display.max_columns,1000) pd.set_option(display.width, 1000) pd.set_option(display.max_colwidth,1000) pd.set_option(display.max_rows,1000)

Linux——Shell編程之正則表達式與文本處理器(筆記)

目錄 基礎正則表達式 1:基礎正則表達式示例 &#xff08;4&#xff09;查找任意一個字符“.”與重新字符“*” &#xff08;5&#xff09;查找連續字符范圍“{ }” 文本處理器 一、sed工具 二、awk工具 &#xff08;1&#xff09;按行輸出文本 &#xff08;2&#xff0…

OpenHarmony系統-源碼下載,環境搭建,編譯,燒錄,調試

獲取源碼 以OpenHarmony5.0.3為例 repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-5.0.3-Release --no-repo-verify repo sync -c repo forall -c git lfs pull搭建環境 安裝必要的工具和命令 apt-get install -y apt-utils binutils bison flex bc …

Vue3 本地打包啟動白屏解決思路!! !

“為什么我訪問 http://127.0.0.1:5501/index.html 白屏&#xff0c;刪了 index.html 再訪問 / 就又活過來了&#xff1f;” —— 你的項目與 SPA 路由的“宮斗大戲” 一、問題復現 場景 本地通過 VSCode Live Server&#xff08;或其他靜態服務器&#xff09;啟動了打包后的 V…

數字人(2):數字人技術全景透視(2025演進版)

隨著人工智能技術的迅猛發展,數字人技術發展也是一日千里。站在當下,著眼未來,我們一起在回眸透視過去的基礎上,一起共同眺望數字人技術的未來。 一、數字人技術體系重構 我們可以用三維定義對數字人技術進行框架重構 維度 技術內涵 典型特征 物理層 人體數字化建模技術 …

小剛說C語言刷題——1035 判斷成績等級

1.題目描述 輸入某學生成績&#xff0c;如果 86分以上(包括 86分&#xff09;則輸出 VERY GOOD &#xff0c;如果在 60到 85之間的則輸出 GOOD (包括 60和 85)&#xff0c;小于 60 的則輸出 BAD。 輸入 輸入只有一行&#xff0c;包括 1個整數。 輸出 輸出只有一行&#xf…

React-在使用map循環數組渲染列表時須指定唯一且穩定值的key

在渲染列表的時候&#xff0c;我們須給組件或者元素分配一個唯一值的key, key是一個特殊的屬性&#xff0c;不會最終加在元素上面&#xff0c;也無法通過props.key來獲取&#xff0c;僅在react內部使用。react中的key本質是服務于diff算法, 它的默認值是null, 在diff算法過程中…

Zookeeper的通知機制是什么?

大家好&#xff0c;我是鋒哥。今天分享關于【Zookeeper的通知機制是什么&#xff1f;】面試題。希望對大家有幫助&#xff1b; Zookeeper的通知機制是什么&#xff1f; 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 Zookeeper 的通知機制是其核心特性之一&#xf…

【LangChain實戰】構建下一代智能問答系統:從RAG架構到生產級優化

打破傳統問答系統的次元壁 當ChatGPT在2022年掀起AI革命時&#xff0c;開發者們很快發現一個殘酷現實&#xff1a;通用大模型在專業領域的表現如同拿著地圖的盲人&#xff0c;既無法理解企業私有數據&#xff0c;也無法保證事實準確性。這催生了RAG&#xff08;檢索增強生成&a…

UDS中功能尋址可以請求多幀數據嘛?當ECU響應首幀后,診斷儀是通過物理尋址發送流控幀嘛?

文章目錄 1. 前言??1.1 功能尋址是否支持請求多幀數據?1.2 ECU發送首幀(FF)后,診斷儀如何發送流控幀(FC)?1.3 協議依據(ISO 14229-1)1.4 實際應用注意事項總結1. 前言?? 在UDS(Unified Diagnostic Services)協議中,功能尋址與物理尋址的使用規則以及多幀數據傳…

PHP異常處理__Throwable

在 PHP 里&#xff0c;Throwable 是一個極為關鍵的接口&#xff0c;自 PHP 7 起被引入。它為錯誤和異常處理構建了一個統一的框架。下面會詳細介紹 Throwable 的相關內容。 1. 基本概念 Throwable 是 Exception 和 Error 的父接口。在 PHP 7 之前&#xff0c;異常&#xff08…

無需訓練的具身導航探索!TRAVEL:零樣本視覺語言導航中的檢索與對齊

作者&#xff1a; Navid Rajabi, Jana Kosecka 單位&#xff1a;喬治梅森大學計算機科學系 論文標題&#xff1a;TRAVEL: Training-Free Retrieval and Alignment for Vision-and-Language Navigation 論文鏈接&#xff1a;https://arxiv.org/pdf/2502.07306 主要貢獻 提出…

Vue3+Vite+TypeScript+Element Plus開發-22.客制Table組件

系列文檔目錄 Vue3ViteTypeScript安裝 Element Plus安裝與配置 主頁設計與router配置 靜態菜單設計 Pinia引入 Header響應式菜單縮展 Mockjs引用與Axios封裝 登錄設計 登錄成功跳轉主頁 多用戶動態加載菜單 Pinia持久化 動態路由 -動態增加路由 動態路由-動態刪除…

Java讀取JSON文件并將其中元素轉為JSON對象輸出

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 Java讀取JSON文件并將其中元素轉為JSON對象輸…

Spring Boot自動配置原理深度解析:從條件注解到spring.factories

大家好&#xff01;今天我們來深入探討Spring Boot最神奇的特性之一——自動配置(Auto-configuration)。這個功能讓Spring Boot如此受歡迎&#xff0c;因為它大大簡化了我們的開發工作。讓我們一起來揭開它的神秘面紗吧&#xff01;&#x1f440; &#x1f31f; 什么是自動配置…

【ELF2學習板】利用OpenMP采用多核并行技術提升FFTW的性能

目錄 引言 OpenMP簡介 編譯OpenMP支持的FFTW庫 部署與測試 測試程序 程序部署 測試結果 結語 引言 在前面已經介紹了在ELF2開發板上運行FFTW計算FFT。今天嘗試利用RK3588的多核運算能力來加速FFT運算。FFTW利用多核能力可以考慮使用多線程或者OpenMP。今天介紹一下Ope…