隊列的實現以及隊列如何實現棧

一、隊列的定義

隊列:只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出
FIFO(First In First Out) 入隊列:進行插入操作的一端稱為 隊尾 出隊列:進行刪除操作的一端稱為 隊頭
隊列也可以數組和鏈表的結構實現,使用鏈表的結構實現更優一些,因為如果使用數組的結構,出隊列在數組頭上出數據,效率會比較低。

二、頭文件以及結構設計

因為隊列對頭節點和尾節點使用多,所以我們用一個結構體封裝出其頭節點和尾節點的地址,會更加方便我們后續的操作:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
// 鏈式結構:表示隊列
typedef int  QDataType;
typedef struct QListNode
{struct QListNode* _pNext;QDataType _data;
}QNode;
// 隊列的結構
typedef struct Queue
{QNode* _front;QNode* _rear;int size;
}Queue;
// 初始化隊列
void QueueInit(Queue* q);
// 隊尾入隊列
void QueuePush(Queue* q, QDataType data);
// 隊頭出隊列
void QueuePop(Queue* q);
// 獲取隊列頭部元素
QDataType QueueFront(Queue* q);
// 獲取隊列隊尾元素
QDataType QueueBack(Queue* q);
// 獲取隊列中有效元素個數
int QueueSize(Queue* q);
// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0 
int QueueEmpty(Queue* q);
// 銷毀隊列
void QueueDestroy(Queue* q);

三、.c文件的實現

1、初始化

void QueueInit(Queue* q)
{assert(q);q->_front = NULL;q->_rear = NULL;q->size = 0;
}

2、銷毀

注意這個與鏈表的銷毀很想,不能簡單的只釋放Queue節點,而是要通過循環將每一塊申請的空間都釋放(充分體現了鏈表的物理結構不連續)

void QueueDestroy(Queue* q)
{QNode* tmp = q->_front;while (tmp!=NULL){QNode* next = tmp->_pNext;free(tmp);tmp = next;}q->_front = q->_rear = NULL;q->size = 0;
}

?3、插入

void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* tmp = (QNode*)malloc(sizeof(QNode));if (tmp == NULL){perror("malloc fail");return;}else {tmp->_data = data;tmp->_pNext = NULL;}if (q->_rear == NULL){q->_front = q->_rear = tmp;}else{q->_rear->_pNext = tmp;q->_rear = tmp;}q->size++;
}

4、出列

void QueuePop(Queue* q)
{assert(q);assert(q->_front);assert(q->size != 0);if (q->_front->_pNext == NULL)//只有一個節點{free(q->_front);q->_front = q->_rear = NULL;}else{QNode* next = q->_front->_pNext;free(q->_front->_pNext);q->_front = next;}q->size--;
}

5、訪問頭數據

QDataType QueueFront(Queue* q)
{assert(q);assert(q->_front);return q->_front->_data;
}

6、訪問尾數據

QDataType QueueBack(Queue* q)
{assert(q);assert(q->_rear);return q->_rear->_data;
}

7、判斷是否為空和獲取數據個數

// 獲取隊列中有效元素個數
int QueueSize(Queue* q)
{assert(q);return q->size;
}
// 檢測隊列是否為空,如果為空返回非零結果,如果非空返回0 
int QueueEmpty(Queue* q)
{assert(q);return q->size == 0;
}

四、用隊列實現棧

1、分析

我們知道棧是先出后進,而隊列是先進先出;

為了操作簡單,我們在一個隊列中存儲數據;當我們需要插入時,我們可以直接插入,將隊列的隊尾當做棧頂,而當我們要出數據時,我們可以將前n個數據移動到第二個隊列中,最后一個在原隊列中出(此時最后一個數據為第一個數據,符合先進先出);

有了以上的思路,那么這道題就非常容易解決了:

2、實現

這里要注意力扣上關于這個函數

它返回的是一個棧這個與初始化不一樣。不能再函數內部直接創建棧變量,而是malloc申請一塊空間后返回該指針(因為局部變量出函數就自動銷毀了)

typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack*psk=(MyStack*)malloc(sizeof(MyStack));QueueInit(&(psk->q1));QueueInit(&(psk->q2));return psk;
}void myStackPush(MyStack* obj, int x) 
{if(!QueueEmpty(&(obj->q1))){QueuePush(&(obj->q1),x);}else{QueuePush(&(obj->q2),x);}
}int myStackPop(MyStack* obj) 
{Queue* tmp=&(obj->q1);//假設p1為空Queue* ntmp=&(obj->q2);//p2不為空if(!QueueEmpty(&(obj->q1))){tmp=&(obj->q2);ntmp=&(obj->q1);//假設p1為空}while(QueueSize(ntmp)>1){QueuePush(tmp,QueueFront(ntmp));QueuePop(ntmp);}int top=QueueFront(ntmp);QueuePop(ntmp);return top;
}int myStackTop(MyStack* obj) 
{if(!QueueEmpty(&(obj->q1))){return QueueBack(&(obj->q1));}else{return QueueBack(&(obj->q2));}
}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&(obj->q1))&&QueueEmpty(&(obj->q2));
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}

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

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

相關文章

20240507 ubuntu20.04+ros noetic 跑通lioslam

任務&#xff1a;跑通lioslam 主要參考博客 IMU激光雷達融合使用LIO-SAM建圖學習筆記——詳細、長文、多圖、全流程_ubuntu_AIDE回歸線-GitCode 開源社區 (csdn.net) 1.不要用這一句 wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2…

【Spring】初識 Spring AOP(面向切面編程)

目錄 1、介紹AOP 1.1、AOP的定義 1.2、AOP的作用 1.3、AOP的核心概念及術語 2、AOP實現示例 3、EnableAspectJAutoProxy注解 1、介紹AOP 1.1、AOP的定義 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直譯過來就是面向切面編程&#xff0c;AOP 是一…

Windows Python 安裝準備

首先安裝配置 1. 環境的安裝和配置: 運行環境: 官方提供了cpython解釋器 編輯環境: 課程初級階段:推薦大家使用: 記事本工具(UE、notepad++、editplus、sublime、vscode) 中期階段IDE的使用,pycharm 2. 安裝python環境: 在官方下載python解釋器 www.python.org …

Ubuntu18.04--虛擬機配置Samba并從Windows登錄

前言&#xff1a; 本文記錄我自己在Windows上安裝 Virtualbox &#xff0c;并在Virtualbox中安裝 Ubuntu-18.04 虛擬機&#xff0c;在Ubuntu-18.04虛擬機里安裝配置Smaba服務器&#xff0c;從 Windows 宿主系統上訪問虛擬機共享samba目錄的配置命令。 引用: N/A 正文 虛擬…

[C++][數據結構]哈希3:unordered_map和unordered_set的模擬實現

前言 今天我們來試著用哈希封裝一下unordered_map和unordered_set這兩個容器 由于主要的哈希的模擬實現都在之前的文章中&#xff0c;所以本文只是對于幾個小問題進行說明 KeyOfT&#xff1a;取出key 因為我們傳的第二個模板參數是T&#xff0c;我們不知道他是key還是pair&l…

Three.js的材質Material信息

Material材質信息,是獨立于物體頂點之外,與渲染效果相關的屬性。比如通過設置材質可以改變物體的顏色、紋理貼圖、光照模式等等。 基本材質【BasicMaterial】 基本材質BasicMaterial的物體,顏色不會因為光照產生明暗、陰影效果。如果沒有指定的材質顏色,那么顏色就是隨機…

協同過濾的一些理解

協同過濾的一些理解 以下是我對協同過濾的一些理解&#xff0c;歡迎來交。 什么是協同過濾 協同過濾&#xff1a;利用相似用戶的行為或相似商品的特征來進行推薦。 協同過濾&#xff08;Collaborative Filtering, CF&#xff09;是推薦系統中一種常用的技術&#xff0c;它基于…

揭秘LLMOps,高效開發大型語言模型

大家好&#xff0c;隨著人工智能&#xff08;AI&#xff09;的蓬勃發展&#xff0c;一個新興領域語言模型運維&#xff08;LLMOps&#xff09;正逐漸成為關注的焦點。LLMOps專注于對大型語言模型&#xff08;LLMs&#xff09;&#xff0c;例如OpenAI的GPT系列&#xff0c;進行全…

SpringBoot Actuator未授權訪問漏洞的解決方法

1. 介紹 Spring Boot Actuator 是一個用于監控和管理 Spring Boot 應用程序的功能模塊。它提供了一系列生產就緒的功能&#xff0c;幫助你了解應用程序的運行狀況&#xff0c;以及在運行時對應用程序進行調整。Actuator 使用了 Spring MVC 來暴露各種 HTTP 或 JMX 端點&#x…

【機器學習】卷積神經(CNN)在圖像識別中的革命性應用:自動駕駛的崛起

卷積神經網絡&#xff08;CNN&#xff09;在圖像識別中的革命性應用&#xff1a;自動駕駛的崛起 一、卷積神經網絡&#xff08;CNN&#xff09;的基本原理二、CNN在圖像識別中的顯著成果三、CNN在自動駕駛汽車中的物體檢測和識別四、CNN在圖像識別中的代碼實例 隨著人工智能和深…

輪式機器人簡介

迄今為止,輪子一般是移動機器人學和人造交通車輛中最流行的運動機構。它可達到很高的效率, 如圖所示, 而且用比較簡單的機械就可實現它的制作。 另外,在輪式機器人設計中,平衡通常不是一個研究問題。 因為在所有時間里,輪式機器人一般都被設計成在任何時間里所有輪子均與地接…

大模型系列之解讀MoE

Mixtral 8x7B 的推出&#xff0c; 使我們開始更多地關注 基于MoE 的大模型架構&#xff0c; 那么&#xff0c;什么是MoE呢&#xff1f; 1. MoE溯源 MoE的概念起源于 1991 年的論文 Adaptive Mixture of Local Experts&#xff08;https://www.cs.toronto.edu/~hinton/absps/jjn…

間隔采樣視頻的代碼

項目統計模型準確率 項目會保存大量視頻&#xff0c;為了統計模型的精度&#xff0c;我們想要十五分鐘抽取一個視頻用來統計。 import os import shutil from datetime import datetime, timedelta #抽取視頻的代碼&#xff0c;會在每個小時的0分、15分、30分、45分取一個命名…

c++ 和c回調混合的一種實現

代碼 #include <iostream> #include <list>using namespace std; struct CallbackBase { virtual void operator()(const char* msg,int len) 0; };void messagesCB(const char* msg,int len) {std::cout<<msg<<" "<<len<<std…

中國土壤類型空間分布數據

中國土壤類型空間分布數據根據全國土壤普查辦公室1995年編制并出版的《1&#xff1a;100萬中華人民共和國土壤圖》數字化生成&#xff0c; 采用了傳統的“土壤發生分類”系統&#xff0c;基本制圖單元為亞類&#xff0c;共分出12土綱&#xff0c;61個土類&#xff0c;227個亞類…

JavaScript原理篇——Promise原理及筆試題實戰演練

Promise 是 JavaScript 中用于處理異步操作的對象&#xff0c;它代表了一個可能還沒有完成的操作的最終完成或失敗&#xff0c;以及其結果值。Promise 對象有三種狀態&#xff1a; Pending&#xff08;進行中&#xff09;&#xff1a;初始狀態&#xff0c;既不是成功&#xff0…

JavaScript BOM - 瀏覽器對象模型

BOM&#xff08;瀏覽器對象模型&#xff09;是JavaScript中與瀏覽器交互的一組API&#xff0c;它提供了一種方法來操作瀏覽器窗口和文檔。BOM由一組對象組成&#xff0c;這些對象允許您訪問瀏覽器本身的功能&#xff0c;而不僅僅是網頁內容。 BOM對象包括&#xff1a; window對…

融知財經:期貨和現貨的區別是什么?哪個風險大?

期貨和現貨在交易對象等方面存在明顯的區別。期貨交易是一種衍生金融工具&#xff0c;主要用于價格發現、風險管理和投機&#xff0c;而現貨交易則是商品和服務的實際買賣。在選擇進行期貨交易還是現貨交易時&#xff0c;投資者需要根據自己的需求和市場情況來決定。 期貨和現貨…

二叉搜索樹 題解 二叉搜索樹的構建 DFS

二叉搜索樹 題目描述 判斷兩序列是否為同一個二叉搜索樹序列。 輸入描述 第一行是一個數 n ( 1 < n < 20 )&#xff0c;表示有 n 個二叉搜索樹序列需要判斷。 接下去一行是一個序列&#xff0c;序列長度小于 10 &#xff0c;包含 0 ~ 9 的數字&#xff0c;沒有重復數…

【Android】Kotlin學習之Lambda表達式

java和kotlin對比 Lambda語法 Lambda隱形參數 it 也可以不使用指定的名稱it, 可以 自定義 Lambda 使用下劃線