數據結構(三)——棧和隊列

一、棧和隊列的定義和特點

棧:受約束的線性表,只允許棧頂元素入棧和出棧

對棧來說,表尾端稱為棧頂,表頭端稱為棧底,不含元素的空表稱為空棧

先進后出,后進先出

隊列:受約束的線性表,只允許在隊尾插入,在隊頭刪除

先進先出,后進后出

二、棧的表示和操作的實現

1.順序棧的表示:存儲結構

#define MAXSIZE 100  //順序棧存儲空間的初始分配址
typedef struct{SElemType *base;  //棧底指針SElemType *top;  //棧頂指針int stacksize;  //棧可用的最大容址
}SqStack;

top指棧頂元素的后一個位置,棧空時top指向的索引定義為-1

S.top = = 0 時,棧空?

S.top == stacksize 時,棧滿

2.順序棧的操作

a.初始化

//初始化
Status InitStack(SqStack &S){//構造一個空棧SS.base = (SElemType*)malloc(MAXSIZE * sizeof(SElemType));if(!S.base) exit(OVERFLOW);  //存儲分配失敗,退出程序S.top = S.base;S.stacksize = MAXSIZE;return OK;
}

b.入棧

當 index = arr.length 時,用戶要入棧,給用戶拋出“棧已滿”的異常(上圖最右邊的情況)

//入棧
Status Push(SqStack &S,SElemType e){//插入元素e為新的棧頂元素if(S.top - S.base >= S.stacksize) {  //棧滿//追加存儲空間S.base = (SElemType*)realloc(S.base,(S.stacksize+MAXSIZE) * sizeof(SElemType));if(!S.base){  //存儲分配失敗exit(OVERFLOW)  //退出程序}S.top = S.base + S.stacksize;S.stacksize += MAXSIZE;}*S.top ++ = e;return OK;
}

c.出棧

如果 index = 0 的時候,用戶要彈棧,給用戶拋出“棧為空”的異常(上圖最右邊的情況)

//出棧
Status Pop(SqStack &S,SElemType &e){//若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERRORif(S.top == S.base){  //棧為空return ERROR;}e = * --S.top;return OK;
}

d.順序取棧頂元素

//順序取棧頂元素
Status GetTop(SqStack S,SElemType &e){//若棧不空,則用e返回S的棧頂元素,并返回OK;否則返回ERRORif(S.top == S.base){  //棧為空e = *(S.top - 1);  //top指向下面的位置即棧頂,然后指向e,即賦值給ereturn OK;}
}

三、循環隊列的表示和操作的實現

1.循環隊列的表示

在循環隊列的順序存儲結構中,除了用一組地址連續的存儲單元依次存放從隊列頭到隊列尾的元素之外,尚需附設兩個指針 front 和 rear 分別指示隊列頭元素及隊列尾元素的位置

初始化建立空隊列時,令 front = rear = 0, 每當插入新的隊列尾元素時,“尾指針增1”;每當刪除隊列頭元素時,“頭指針增1”。因此,在非空隊列中,頭指針始終指向隊列頭元素,而尾指針始終指向隊列尾元素的下一個位置

我們發現,在隊列滿時和空隊列時,頭指針和尾指針都指向同一個元素,那么如何分辨隊列滿和空隊列?

1、少用一個元素空間, 即隊列空間大小為m時,有m-1個元素就認為是隊滿。這樣判斷隊空的條件不變,良D當頭、尾指針的值相同時, 則認為隊空;而當尾指針在循環意義上加1后是等于頭指針,則認為隊滿。隊空的條件:Q.front ==Q.rear
隊滿的條件:(Q.rear+ 1)%MAXQSIZE == Q.front
入隊:Q.rear=(Q.rear +1)% MAXQSIZE
出隊:Q.front=(Q.front +1)% MAXQSIZE

當前元素個數:(Q.rear-Q.front+MAXQSIZE)% MAXQSIZE

如上圖所示,當J7、J8、J9 進入隊列后,(Q.rear+ 1)%MAXQSIZE 的值等于 Q.front,此時認為隊滿。

2、另設一個標志位以區別隊列是“空”還是“滿"

2.循環隊列的操作

(1)定義存儲結構

#define MAXSIZE 100 
typedef struct{QElemType *base;  //初始化的動態分配存儲空間int front;  //頭指針,若隊列不空,指向隊列頭元素int rear;  //尾指針,若隊列不空,指向隊列尾元素的下一個位置
}SqQueue;

(2)初始化

//初始化
Status InitQueue(SqQueue &Q) {//構造一個空隊列QQ.base = (QElemType *)malloc(MAXSIZE * sizeof(QElemType));if(!Q.base){exit(OVERFLOW);}Q.front = Q.rear = 0;return OK;
}

(3)求元素個數

//求元素個數
int QueueLength(SqQueue Q){//返回Q的元素個數return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}

(4)插入新元素

//插入新元素
Status EnQueue(SqQueue &Q,QElemType e){//插入元素e為Q的新的隊尾元素//判斷隊列是否為空if((Q.rear + 1) % MAXSIZE == Q.front){return ERROR;}Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXSIZE;return OK;
}

(5)刪除元素

//刪除元素
Status DeQueue(SqQueue %Q,QElemType &e){//若隊列不空,則刪除Q的對頭元素,用e返回其值,并返回OK;否則返回ERRORif(Q.front == Q.rear){return ERROR;}e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXSIZE;return OK;
}

四、總結與習題

棧是限定僅在表尾進行插入或刪除的線性表,又稱為后進先出的線性表。棧有兩種存儲表示,順序表示(順序棧)和鏈式表示(鏈棧)。棧的主要操作是進棧和出棧,對于順序棧的進棧和出棧操作要注意判棧滿或棧空。

隊列是一種先進先出的線性表。它只允許在表的一端進行插入,而在另一端刪除元素。隊列也有兩種存儲表示順序表示(循環隊列)和鏈式表示(鏈隊)

棧和隊列的邏輯結構都和線性表一樣,數據元素之間存在一對一的關系。

循環隊列中少用一個元素判斷隊空或隊滿時:

隊空的條件::Q.front == Q.rear

隊滿的條件:(Q.rear+1)%MAXQSIZE == Q.front

答案:C

答案:C

解釋:棧是后進先出的線性表,一個棧的入棧序列是1,2,3,…,n,而輸出序列的第一個元素為n,說明1,2,3,…,n一次性全部進棧,再進行輸出,所以p1=n,p2=n-1,….pi=n-i+1

答案:D

解釋:對于非循環隊列,尾指針和頭指針的差值便是隊列的長度,而對于循環隊列,差值可能為負數,所以需要將差值加上MAXSIZE(本題為n),然后與MAXSIZE(本題為n)求余,即(n+r-f)%n

答案:B (方法同第一題)

元素出隊序列默認就是元素的入隊序列

答案:C

解釋:初始棧頂指針top為n+1,說明元素從數組向量的高端地址進棧,又因為元素存儲在向量空間V[1...n]中,所以進棧時top指針先下移變為n,之后將元素x存儲在V[n]

答案:A

解釋:x=top->data將結點的值保存到x中,top=top->link棧頂指針指向棧頂下一結點,即摘除棧頂結點。

答案:D

解釋:一般情況下只修改頭指針,但是,當刪除的是隊列中最后一個元素時,隊尾指針也丟失了,因此需對隊尾指針重新賦值。

答案:D

解釋:數組A[0...m]中共含有m+1個元素,故在求模運算時應除以m+1

答案:B

答案:C

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

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

相關文章

SQL Server 存儲過程開發三層結構規范

以下是《SQL Server 存儲過程開發三層結構規范》的正式文檔結構,適用于企業級數據庫應用開發場景,有助于團隊協作、代碼審查與自動化運維: 📘 SQL Server 存儲過程開發三層結構規范 一、架構設計總覽 三層結構簡介 層級命名約定…

接上篇,解決FramePack啟動報錯:“httpx.ReadError: [WinError 10054] 遠程主機強迫關閉了一個現有的連接。“的問題

#工作記錄 FramePack部署(從PyCharm解釋器創建和使用開始)保姆級教程-CSDN博客 上篇我們記錄到FramePack從克隆到啟動調試的保姆級教程,關于啟動時會報以下錯誤的問題,已作出解決: 報錯摘錄: (.venv) PS F…

ping_test_parallel.sh 并行網絡掃描腳本

并行網絡掃描腳本分析:提高網絡探測效率 引言腳本概述核心代碼分析顏色定義與初始化并行處理機制并行執行與進程控制結果處理與統計 技術亮點性能分析結論附錄:完整腳本 引言 在網絡管理和運維過程中,快速檢測網段內主機的在線狀態是一項常見…

leetcode 3342. 到達最后一個房間的最少時間 II 中等

有一個地窖,地窖中有 n x m 個房間,它們呈網格狀排布。 給你一個大小為 n x m 的二維數組 moveTime ,其中 moveTime[i][j] 表示在這個時刻 以后 你才可以 開始 往這個房間 移動 。你在時刻 t 0 時從房間 (0, 0) 出發,每次可以移…

關于vue-office在vue3工程中的引用報錯問題

在vue3項目工程中,根據vue-office文檔在vue2中的引用: //引入VueOfficeDocx組件 相關樣式import VueOfficeDocx from vue-office/docx;import vue-office/docx/lib/index.css; 報錯信息: [plugin:vite:import-analysis] Failed to resolve …

【macOS常用快捷鍵】

以下是 macOS 最常用快捷鍵列表,按使用頻率由高到低分類整理,涵蓋日常操作、效率工具及系統控制,助你快速提升使用效率: 一、基礎高頻操作 快捷鍵功能說明Command C復制選中內容Command V粘貼Command X剪切Command Z撤銷上一…

mdadm 報錯: buffer overflow detected

最近跑 blktest (https://github.com/osandov/blktests) 時發現 md/001 的測試失敗了 單獨執行,最后定位到是 mdadm 命令報錯: buffer overflow detected 這個 bug 目前已經修復: https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/commit/?id827e1870f3205…

查看jdk是否安裝并且配置成功?(Android studio安裝前的準備)

WinR輸入cmd打開命令提示窗口 輸入命令 java -version 回車顯示如下:

STM32智能刷卡消費系統(uC/OS-III)

一、項目概述與開發背景 本系統是一款基于STM32微控制器的智能刷卡消費終端,集成RFID識別、OLED顯示、Flash存儲、藍牙通信等核心模塊。項目采用uC/OS-III實時操作系統實現多任務并發處理,適用于校園一卡通、企業食堂等小額支付場景。系統支持定額扣款、…

[人機交互]以用戶為中心的交互設計

一.以用戶為中心設計的兩個特征 ? 理解和指定產品的使用上下文 ,并用于指導設計 ? 用戶參與式開發 ? 參與 評估研究 (第十 — 十四章) ? 參與 設計過程 :用戶作為合作設計人員 二.用戶參與設計的重要性 ? 需求的獲取主要來源…

Abaqus學習筆記

目錄 Abaqus介紹 學習資源 ?編輯Abaqus/CAE abaqus下載安裝 abaqus基本操作 Abaqus啟動 新建模型 ?編輯 ?編輯修改界面背景 ?編輯?編輯結果信息的顯示與否 ?編輯計算結果信息字體設置 ?編輯允許多繪圖狀態 單位量綱 視圖操作 事前說明 ODB文件 本構關系…

論壇系統開發(0-1) (上 前置知識介紹)

前置知識 1. 軟件的生命周期 生命周期: 對事物進行定義(描述) -> 創建 -> 使用 -> 銷毀的過程 軟件?命周期中以劃分為可?性研究、需求分析、概要設計、詳細設計、實現、組裝(集成)測試、確認測試、使?、維護、退役10個階段,如下圖: a. 可…

架構師面試(三十七):監控系統架構模式

題目 監控是在產品生命周期的運維環節,能對產品的關鍵指標數據進行【實時跟蹤】并對異常數據進行【實時報警】。 一句話描述,監控系統可以幫我們【主動預防和發現】業務系統中的問題。 我們常說,監控系統是 “糧草”,業務系統是…

【面試 · 二】JS個別重點整理

目錄 數組方法 字符串方法 遍歷 es6 構造函數及原型 原型鏈 this指向 修改 vue事件循環Event Loop FormData 數組方法 改變原數組:push、pop、shift、unshift、sort、splice、reverse不改變原屬組:concat、join、map、forEach、filter、slice …

深度學習里程碑:AlexNet 架構解析與核心技術詳解

內容摘要 本文深度解析2012年ILSVRC冠軍模型AlexNet,全面闡述其在深度學習發展中的關鍵突破。從模型架構出發,詳細解析卷積層、池化層、全連接層的數學原理,重點分析ReLU激活函數、LRN局部歸一化、重疊池化等創新技術的數學表達與工程價值。…

第5章 深度學習和卷積神經網絡

深度學習是人工智能的一種實現方法。本章我們將考察作為深度學習的代表的卷積神經網絡的數學結構。 5-1小惡魔來講解卷積神經網絡的結構 深度學習是重疊了很多層的隱藏層(中間層)的神經網絡。這樣的神經網絡使隱藏層具有一定的結構,從而更加…

JVM——JVM是怎么實現invokedynamic的?

JVM是怎么實現invokedynamic的? 在Java 7引入invokedynamic之前,Java虛擬機(JVM)在方法調用方面相對較為“僵化”。傳統的Java方法調用主要依賴于invokestatic、invokespecial、invokevirtual和invokeinterface這四條指令&#x…

STM32教程:ADC原理及程序(基于STM32F103C8T6最小系統板標準庫開發)*詳細教程*

前言: 本文章介紹了STM32微控制器的ADC外設,介紹了ADC的底層原理以及基本結構,介紹了ADC有關的標準庫函數,以及如何編寫代碼實現ADC對電位器電壓的讀取。 可以根據基本結構圖來編寫代碼 大體流程: 1、開啟RCC時鐘(包括ADC和GPIO的時鐘,另外ADCCLK的分頻器,也需要配置…

2025年APP安全攻防指南:抵御DDoS與CC攻擊的實戰策略

2025年,隨著AI技術與物聯網設備的深度滲透,DDoS與CC攻擊的復雜性和破壞性顯著升級。攻擊者通過偽造用戶行為、劫持智能設備、利用協議漏洞等手段,對APP發起精準打擊,導致服務癱瘓、用戶流失甚至數據泄露。面對這一挑戰&#xff0c…

STM32的定時器

定時器的介紹 介紹:STM32F103C8T6微控制器內部集成了多種類型的定時器,這些定時器在嵌入式系統中扮演著重要角色,用于計時、延時、事件觸發以及PWM波形生成、脈沖捕獲等應用。 *幾種定時器(STM32F103系列)&#xff1…