數據結構(9)棧和隊列

1、棧

1.1 概念與結構

? ? ? ? 棧是一種特殊的線性表,只允許在固定的一端進行插入和刪除元素的操作。進行數據插入和刪除的一端稱為棧頂,另一端稱為棧底。棧里面的數據元素遵循后進先出的原則。棧的底層實現一般可以使用數組或者鏈表來實現,但數組的實現更優,因為空間消耗更少。

1.2 棧的實現

Stack.c

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>//定義棧的結構
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;       //指向棧頂的位置int capacity;  //棧的容量
}ST;//初始化
void StackInit(ST* ps);//入棧——棧頂
void StackPush(ST* ps, STDataType x);//出棧——棧頂
void StackPop(ST* ps);//棧是否為空
bool StackEmpty(ST* ps);//取棧頂元素
STDataType StackTop(ST* ps);//獲取棧中有效元素個數
int StackSize(ST* ps);//銷毀
void StackDestroy(ST* ps);

?Stack.h

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"//初始化
void StackInit(ST* ps)
{ps->arr = NULL;ps->top = ps->capacity = 0;
}//入棧——棧頂
void StackPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){//增容int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}ps->arr[ps->top++] = x;
}//棧是否為空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//出棧——棧頂
void StackPop(ST* ps)
{assert(!StackEmpty(ps));ps->top--;
}//取棧頂元素
STDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}//獲取棧中有效元素個數
int StackSize(ST* ps)
{return ps->top;
}//銷毀
void StackDestroy(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}

test.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"void test01()
{ST st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);while (!StackEmpty(&st)){STDataType top = StackTop(&st);printf("%d ", top);StackPop(&st);}StackDestroy(&st);
}int main()
{test01();return 0;
}

1.3 棧的算法題

https://leetcode.cn/problems/valid-parentheses

?思路:借助數據結構——棧

遍歷字符串,(1)左括號進棧(2)遇到右括號,取棧頂元素與之比較,看是否匹配

//定義棧的結構
typedef char STDataType;
typedef struct Stack
{STDataType* arr;int top;       //指向棧頂的位置int capacity;  //棧的容量
}ST;//初始化
void StackInit(ST* ps)
{ps->arr = NULL;ps->top = ps->capacity = 0;
}//入棧——棧頂
void StackPush(ST* ps, STDataType x)
{assert(ps);if (ps->top == ps->capacity){//增容int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}ps->arr[ps->top++] = x;
}//棧是否為空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//出棧——棧頂
void StackPop(ST* ps)
{assert(!StackEmpty(ps));ps->top--;
}//取棧頂元素
STDataType StackTop(ST* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}//獲取棧中有效元素個數
int StackSize(ST* ps)
{return ps->top;
}//銷毀
void StackDestroy(ST* ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}
//---------------------以上是棧的實現代碼-------------------
//借助數據結構——棧
bool isValid(char* s) 
{ST st;StackInit(&st);char* pi = s;while(*pi != '\0'){//左括號入棧if(*pi == '(' || *pi == '[' || *pi == '{'){StackPush(&st, *pi);}else{//判斷棧為空的情況if(StackEmpty(&st)){StackDestroy(&st);return false;}//右括號——取棧頂與*pi進行匹配char top = StackTop(&st);if((top == '(' && *pi != ')') || (top == '[' && *pi != ']') || (top == '{' && *pi != '}')){StackDestroy(&st);return false;}StackPop(&st);}pi++;}bool ret = StackEmpty(&st) ? true : false;StackDestroy(&st);return ret;
}

2、隊列

2.1 概念與結構

? ? ? ? 只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表。隊列具有先進先出的特點。進行插入操作的一端稱為隊尾,進行刪除操作的一端稱為隊頭。那么,隊列底層結構該如何實現呢?如果用數組來實現,那么入隊操作時間復雜度為O(1),出隊O(N)。如果用鏈表來實現,那么入隊O(N),出隊O(1)。但是,我們可以定義一個隊尾指針pTail來優化,這樣入隊的時間復雜度就變為O(1)。所以我們采用鏈表來實現隊列。

2.2 隊列的實現?

Queue.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>typedef int QDataType;
//隊列結點的結構
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QueueNode;
//隊列的結構
typedef struct Queue
{QueueNode* phead;QueueNode* ptail;int size; //隊列中有效數據個數
}Queue;//初始化
void QueueInit(Queue* pq);//銷毀隊列
void QueueDestroy(Queue* pq);//入隊——隊尾
void QueuePush(Queue* pq, QDataType x);//出隊——隊頭
void QueuePop(Queue* pq);//隊列判空
bool QueueEmpty(Queue* pq);//取隊頭數據
QDataType QueueFront(Queue* pq);//取隊尾數據
QDataType QueueBack(Queue* pq);//隊列有效元素個數
int QueueSize(Queue* pq);

Queue.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}//銷毀隊列
void QueueDestroy(Queue* pq)
{assert(pq);QueueNode* pcur = pq->phead;while (pcur){QueueNode* next = pcur->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}//入隊——隊尾
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;//隊列為空if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else{//隊列非空pq->ptail->next = newnode;pq->ptail = pq->ptail->next;}pq->size++;
}//隊列判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}//出隊——隊頭
void QueuePop(Queue* pq)
{assert(!QueueEmpty(pq));//只有一個結點,phead和ptail都要置為空if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QueueNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}//取隊頭數據
QDataType QueueFront(Queue* pq)
{assert(!QueueEmpty(pq));return pq->phead->data;
}//取隊尾數據
QDataType QueueBack(Queue* pq)
{assert(!QueueEmpty(pq));return pq->ptail->data;
}//隊列有效元素個數
int QueueSize(Queue* pq)
{assert(pq);//第一種方式:遍歷鏈表(適用于不會頻繁調用隊列有效數據個數的場景)//QueueNode* pcur = pq->phead;//int size = 0;//while (pcur)//{//	size++;//	pcur = pcur->next;//}//return size;//第二種方式:適用于頻繁調用隊列有效數據個數的場景return pq->size;
}

test.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"void test01()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);int front = QueueFront(&q);int rear = QueueBack(&q);printf("front:%d\n", front);printf("rear:%d\n", rear);printf("size:%d\n", QueueSize(&q));
}int main()
{test01();return 0;
}

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

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

相關文章

湖北大學暑期實訓優秀作品:面向美麗中國的數據化可視平臺

開發背景2024年1月11日&#xff0c;《中共中央國務院關于全面推進美麗中國建設的意見》發布&#xff0c;明確了建設美麗中國的總體要求、主要目標和重點任務&#xff0c;為我國生態文明建設提供了頂層設計和行動指南。系統簡介當前&#xff0c;中國正以空前的力度推進生態文明建…

Ubuntu系統VScode實現opencv(c++)隨機數與隨機顏色

在圖像處理與計算機圖形學中&#xff0c;隨機數與隨機顏色的生成常用于增強圖像的多樣性、可視化多個目標區域、模擬自然現象以及生成測試數據等任務。通過隨機化元素的顏色、位置或形狀&#xff0c;可以使程序在動態展示、調試輸出、以及數據增強等方面更加靈活和豐富。例如&a…

機器學習、深度學習與數據挖掘:三大技術領域的深度解析

基本概念與歷史沿革數據挖掘起源于20世紀90年代&#xff0c;是數據庫技術、統計學和機器學習交叉融合的產物。它經歷了從簡單查詢到復雜知識發現的演變過程&#xff0c;早期階段主要關注數據存儲和檢索&#xff0c;隨著IBM、微軟等公司的推動&#xff0c;逐漸形成了完整的知識發…

MoR vs MoE架構對比:更少參數、更快推理的大模型新選擇

Google DeepMind 近期發布了關于遞歸混合&#xff08;Mixture of Recursion&#xff09;架構的研究論文&#xff0c;這一新型 Transformers 架構變體在學術界和工業界引起了廣泛關注。該架構通過創新的設計理念&#xff0c;能夠在保持模型性能的前提下顯著降低推理延遲和模型規…

uniapp開發實現【中間放大兩邊縮小的輪播圖】

一、效果展示 二、代碼實現 <template><view><!-- 輪播圖 --><view class=<

機器學習沒有最好的模型,只有最合適的選擇(模型選擇)

機器學習領域存在"沒有免費午餐"定理&#xff0c;沒有任何一種模型在所有問題上都表現最優。不同模型有各自的優勢和適用場景。同一數據集上&#xff0c;不同模型的預測性能可能有巨大差異。例如&#xff0c;線性關系明顯的數據上線性模型可能表現優異&#xff0c;而…

關于人工智能AI>ML>DL>transformer及NLP的關系

一、AI、ML、DL、NLP的極簡概念1、人工智能&#xff08;AI&#xff09;有不同的定義&#xff0c;但其中一個定義或多或少已成為共識&#xff0c;即AI是一個計算機系統&#xff0c;它能夠執行通常需要人類智能才能完成的任務。根據這個定義&#xff0c;許多算法可以歸納為AI算法…

小迪23-28~31-js簡單回顧

前端-js開發 課堂完結后欲復習鞏固也方便后續-重游-故寫此篇 從實現功能過渡到涉及的相關知識點 知識點 1、 JS 是前端語言&#xff0c;是可以被瀏覽器“看到”的&#xff0c;當然也可以被修改啊&#xff0c;被瀏覽器禁用網頁的 JS 功能啊之類的。所以一般都是前后端分離開發&…

vue項目預覽pdf隱藏工具欄和側邊欄

1.在預覽PDF時&#xff0c;PDF查看器通常會顯示工具欄、側邊欄等控件。如果想隱藏這些控件&#xff0c;可以通過在PDF文件的URL中添加參數來實現。可以使用#toolbar0和#navpanes0等參數來隱藏工具欄和側邊欄。解釋&#xff1a; #toolbar0&#xff1a;隱藏工具欄。#navpanes0&am…

ERP、CRM、OA整合工具哪家好?2025年最新推薦

當前&#xff0c;大多數中大型企業已部署了ERP&#xff08;企業資源計劃&#xff09;、CRM&#xff08;客戶關系管理&#xff09;、OA&#xff08;辦公自動化&#xff09;等核心業務系統。這些系統在各自職能領域內發揮著關鍵作用&#xff1a;ERP管理財務、供應鏈與生產&#x…

設計模式:命令模式 Command

目錄前言問題解決方案結構代碼前言 命令是一種行為設計模式&#xff0c;它可將請求轉換為一個包含與請求相關的所有信息的獨立對象。該轉換讓你能根據不同的請求將方法參數化、延遲請求執行或將其放入隊列中&#xff0c;且能實現可撤銷操作。 問題 假如你正在開發一款新的文字…

4-verilog簡單狀態機

verilog簡單狀態機 1. always (posedge clk or negedge rst_n) beginif (!rst_n)cnt_1ms < 20b0;else if (cnt_1ms_en)cnt_1ms < cnt_1ms 1b1;elsecnt_1ms < 20d0; endalways (posedge clk or negedge rst_n) beginif(!rst_n)cur_state < s1_power_init;else i…

ICCV2025 | 對抗樣本智能安全方向論文匯總 | 持續更新中~

匯總結果來源&#xff1a;ICCV 2025 Accepted Papers 若文中出現的 論文鏈接 和 GitHub鏈接 點不開&#xff0c;則說明還未公布&#xff0c;在公布后筆者會及時添加. 若筆者未及時添加&#xff0c;歡迎讀者告知. 文章根據題目關鍵詞搜索&#xff0c;可能會有遺漏. 若筆者出現…

SPI通信中CS片選的兩種實現方案:硬件片選與軟件片選

一. 簡介本文簡單熟悉一下SPI通信中的片選信號&#xff08;CS&#xff09;的兩種實現方案&#xff1a;硬件片選和軟件片選&#xff0c;以及兩種方案的區別&#xff0c;如何選擇。在SPI&#xff08;Serial Peripheral Interface&#xff09;通信中&#xff0c;片選信號&#xff…

IBM 報告稱除美國外,全球數據泄露成本下降

IBM 發布的一份針對 113,620 起數據泄露事件的年度全球分析報告發現&#xff0c;平均數據泄露成本同比下降了 9%&#xff0c;這主要歸功于更快的發現和遏制速度。 該報告與波耐蒙研究所 (Ponemon Institute) 合作完成&#xff0c;發現全球平均數據泄露成本從 2024 年的 488 萬美…

Docker Compose 部署 Dify + Ollama 全棧指南:從裸奔到安全可觀測的 AI 應用實戰

&#x1f4cc; 摘要 本文以中國開發者視角出發&#xff0c;手把手教你用 Docker Compose 在本地或輕量云主機上部署 Dify Ollama 組合棧&#xff0c;實現“安全、可觀測、可擴展”的私有化 AI 應用平臺。全文約 8 000 字&#xff0c;包含&#xff1a; 架構圖、流程圖、甘特圖…

「源力覺醒 創作者計劃」_全方面實測文心ERNIE-4.5-VL-28B-A3B開源大模型

「源力覺醒 創作者計劃」_全方面實測文心ERNIE-4.5-VL-28B-A3B開源大模型1. 文心大模型4.5-28B概述2. 部署ERNIE-4.5-VL-28B-A3B文心大模型2.1. 創建GPU云主機2.2. ERNIE-4.5-VL-28B-A3B部署2.3. 創建大模型API交互接口3. 文心大模型4.5-28B多方面性能評測3.1. 語言理解方面3.2…

數據庫學習------數據庫事務的特性

在數據庫操作中&#xff0c;事務是保證數據一致性和完整性的核心機制。無論是簡單的單表更新&#xff0c;還是復雜的多表關聯操作&#xff0c;事務都扮演著至關重要的角色。那么什么是數據庫事務&#xff1f;數據庫事務是一個不可分割的操作序列&#xff0c;它包含一個或多個數…

18-C語言:第19天筆記

C語言&#xff1a;第19天筆記 內容提要 構造類型 結構體共用體/聯合體構造類型 數據類型 基本類型/基礎類型/簡單類型 整型 短整型&#xff1a;short – 2字節基本整型&#xff1a;int – 4字節長整型&#xff1a;long – 32位系統4字節/ 64位系統8字節長長整型&…

centos下安裝anaconda

下載 anaconda 安裝包 wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh 2. 授權 chmod x Anaconda3-2022.05-Linux-x86_64.sh 3. 安裝 ./Anaconda3-2022.05-Linux-x86_64.sh 此時顯示Anaconda的信息&#xff0c;并且會出現More&#xff0c;繼續…