【追求卓越04】數據結構--棧與隊列

引導

????????今天我們開始學習棧與隊列的內容,我覺得棧并不難,所以篇幅也就不會那么多了。在虛擬空間中,棧是用戶空間中的一種數據結構,它主要用于保存局部變量。那么問題來了,為什么用棧來保存局部變量,不用別的數據結構呢?堆,數組,鏈表不可以嗎

????????我們知道棧的特點就是先進后出,后進先出。其實,我們可以這樣定義,滿足先進后出,后進先出操作特性的就是棧。因此棧沒有固定的存儲形式,比如數據是需要存儲地址連續,鏈表存儲地址可以不連續。棧可以用數組或鏈表都可以實現,只要它滿足先進后出,后進先出操作特性即可。

????????因此棧就是一個操作受限(只能從一端壓棧,出棧)的線性表。

棧的復雜度

????????棧的操作只有入棧和出棧,并且只涉及到棧頂的元素。所以它的復雜度都為O(1)。如圖:

棧的應用

????????特定的數據結構是對特定場景的抽象。那么有些問題用棧來處理肯定會比較方便。

棧在表達式中的使用

????????在《程序語言設計基礎》中有關于表達式知識點:比如一個3+5*8-6的表達式,你會怎么設計,讓計算機去識別,計算呢?記得以前寫過類似的程序,現在想想還有很多的優化空間。

????????在表達式中,有中綴表達式,前綴表達式,后綴表達式3種。它們的分析方式也不相同。有興趣的可以去了解一下我的另一篇文章【獻給過去的自己】棧實現計算器(C語言)-CSDN博客。

棧在函數調用中的應用

????????正如我們在開頭引入的話題,為什么局部變量要保存在棧中?這里有幾點需要解釋:

  1. 局部變量保存在棧中,這個棧是內存中實際存在的棧,是真實的物理區。而我們全文所介紹的棧是一個數據結構,是抽象的。要區分開兩個棧。
  2. 內存中的棧因為它的操作特性符合棧數據結構的特點,所以稱為棧區。棧區主要存儲運行方法的形參、局部變量、返回值。由系統自動分配和回收。

那么我們為什么要將局部變量保存在棧區呢?

????????其實我們并不是必須要使用棧結構,使用數組和鏈表也是可以的。可能稍微會麻煩點。函數之間調用,變化的主要是作用域及生命周期。

  • 當A函數進入B函數,就不能再訪問A函數中的局部變量了。
  • B函數返回A函數之后,B函數中的局部變量就需要釋放。

????????針對作用域和生面周期變化的,我覺得棧可以很好的實現。進入一個函數時,在棧中記錄入口(作用域界限),之后進行壓棧操作,在該函數內部只能訪問界限以內的數據。當退出函數時,將入口以內的數據直接釋放。

隊列

????????隊列和棧都是抽象的數據結構,是一個操作受限的線性表。它的特點就是先進先出(FIFO)。 它的操作又入隊(將一個數據放到隊尾)和出隊(從隊列頭部取出一個數據)。和棧相似,如圖:

順序隊列

????????隊列和棧一樣,都能用數組和鏈表來實現。用數組實現就是順序隊列,用鏈表實現就是鏈式隊列。我這里就簡單用C語言實現一個順序隊列。

queue_len = 100
int queue[queue_len]={0};
head=0;
tail=0;
//
隊空:head=tail;
//堆滿:head=0 tail=queue_len;
bool enqueue (int item)
{
??? if(tail == queue_len && head == 0)
??????? return false;
??? if(tail == n)
??? {
??????? int i = 0;
??????? for(i = 0 ; i < (tail - head) ; i++)
??????????? queue[i] = queue[head+i];
??????? queue[tail-head] = item;
??????? tail = tail-head + 1;
??????? head=0;

??? }
??? else
??? {
??????? queue[tail++] = item
??? }

??? return true;

}
int dequeue()
{
??? if(head == tail)
? ??????return false;
??? return queue[head++];
}

該實現方式,出隊和入隊操作的復雜度都是O(1)。

循環隊列

????????在上面的隊列中,當tail等于隊列長度時,就需要進行數據搬移。循環隊列就是省去了這個操作。循環隊列的難點就在于如何確定隊列滿和隊列空

  • 隊列滿:(tail+1 % queue) == head
  • 隊列空:head=tail

堆滿的判斷方式會浪費數組中一個元素。故循環隊列可按照下列實現:

queue_len = 100
int queue[queue_len]={0};
head=0;
tail=0;
//
隊空:head==tail;
//堆滿::(tail+1 % queue) == head;
bool enqueue (int item)
{
??? if(((tail+1) % queue_len) == head)
??????? return false;
??? queue[tail] = item;
??? tail = (tail+1) % queue_len;
??? return true;
}
int dequeue()
{
??? if(head==tail)
??????? return false;
??? int item = queue[head];
??? head = (head+1)%queue_len
??? return item;
}

隊列的用途

????????隊列一般用于緩存操作。比如消息隊列線程池等都是使用了隊列。但是隊列的大小設置是需要我們關注的。我個人主要的考慮依據是:在可接受的反應時間內,將隊列設置到最大

總結

????????本節主要介紹了棧數據結構,它具有先進后出,后進先出的操作特點。以及棧的在表達式和函數調用上的應用。一定要區別棧數據結構和內存中的棧不是完全相同的概念。算是交際關系.

????????隊列的概念,并實現了隊列和循環隊列。以及隊列大小設置的依據。

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

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

相關文章

Spring Boot 3 集成 Knife4j

基礎環境 SpringBoot : 3.0.6 Java: jdk-17.0.5 Maven: 3.6.1依賴 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…

Go 語言函數、參數和返回值詳解

函數是一組語句&#xff0c;可以在程序中重復使用。函數不會在頁面加載時自動執行。函數將通過調用函數來執行。 創建函數 要創建&#xff08;通常稱為聲明&#xff09;一個函數&#xff0c;請執行以下操作&#xff1a; 使用 func 關鍵字。指定函數的名稱&#xff0c;后跟括…

Java編程技巧:if-else優化實踐總結歸納

文/朱季謙 說實話&#xff0c;其實我很討厭在代碼里大量使用if-else&#xff0c;一是因為該類代碼執行方式屬于面向過程的&#xff0c;二嘛&#xff0c;則是會顯得代碼過于冗余。這篇筆記&#xff0c;主要記錄一些自己在工作實踐當中針對if-else的優化心得&#xff0c;將會不定…

10年開發工程師總結,8大主流程序員兼職平臺,月入30k不是夢!

今年互聯網行業陸續裁員減薪&#xff0c;許多人怨聲載道的同時也開始另謀出路。而對于程序員更是應該提早做好準備&#xff0c;活躍在兼職接單的最前沿。 我們程序員是一門技術工種&#xff0c;與互聯網其他行業相比薪水會相對高一點&#xff0c;不過錢也不是那么好賺的&#…

C++中類和動態內存分配

new關鍵字 在C中&#xff0c;內存分為棧和堆。棧中的對象生命周期較短&#xff0c;往往在作用域結束后就會銷毀&#xff0c;而堆中的對象生命周期較長&#xff0c;只有當使用delete或者程序結束時才會銷毀。而new則是將我們創建的對象分配到堆中&#xff0c;使對象可以跨作用域…

2023年【廣東省安全員B證第四批(項目負責人)】報名考試及廣東省安全員B證第四批(項目負責人)復審考試

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 廣東省安全員B證第四批&#xff08;項目負責人&#xff09;報名考試是安全生產模擬考試一點通總題庫中生成的一套廣東省安全員B證第四批&#xff08;項目負責人&#xff09;復審考試&#xff0c;安全生產模擬考試一點…

json_to_mask

修改后的json_to_dataset文件&#xff0c;直接復制替換你自己原始的json_to_dataset&#xff0c;建議保存一下原版import argparse import base64 import json import os import os.path as ospimport imgviz import PIL.Imagefrom labelme.logger import logger from labelme …

java:springboot單元測試spring-boot-starter-test

背景 Java的單元測試可以使用多個框架&#xff0c;其中比較流行的包括&#xff1a; JUnit&#xff1a;JUnit是Java單元測試最常用的框架&#xff0c;它提供了一套豐富的API&#xff0c;可以方便地編寫測試用例和測試套件。JUnit 5是JUnit的最新版本&#xff0c;引入了許多新功…

ElMessageBox中的子組件回調關閉函數

父組件中&#xff1a; const closeMessageBox () > {ElMessageBox.close();getList(); };const open () > {ElMessageBox({title: 添加商品,message: h(AddTaxExemption, { onClose: closeMessageBox }),customClass: custom-message-box, showConfirmButton: false,d…

各大電商平臺雙十一“狂飆”,如何選擇商城系統?

今年是“雙十一”的第十五年。作為各大平臺和品牌的全年最重要的營銷節點&#xff0c;品牌們可謂是來勢洶洶&#xff0c;各種促銷活動和優惠力度讓人眼花繚亂。 淘天數據顯示&#xff0c;天貓促銷活動開售當晚&#xff0c;155個品牌開賣成交額突破1億元&#xff1b;首小時內7.1…

str轉wstr的三種方法和從網站獲取json數據到數據隨機提取,返回拼接字符串和動態數組

庫的設置 hv庫 外部包含目錄&#xff1a;…\include\libhv_new\hv; 庫目錄&#xff1a;…\include\libhv_new\lib\x86\Release; 附加依賴項&#xff1a;hv.lib; //Get請求 獲取json數據&#xff0c;然后提取符合 條件的&#xff0c;time值大于自定義變量的值&#xff0c;然后取…

【UE】用樣條線實現測距功能(上)

目錄 效果 步驟 一、創建樣條網格體組件3D模型 二、實現點擊連線功能 三、實現顯示兩點間距離功能 效果 步驟 一、創建樣條網格體組件3D模型 創建一個圓柱模型&#xff0c;這里底面半徑設置為10mm&#xff0c;高度設置為1000mm 注意該模型的坐標軸在如下位置&#xff1…

基于pytest的服務端http請求的自動化測試框架?

1、引言 我有一個朋友是做 Python 自動化測試的。前幾天他告訴我去參加一個大廠面試被刷了。 我問他是有沒有總結被刷下來的原因。他說面試官問了一些 pytest 單元測試框架相關的知識&#xff0c;包括什么插件系統和用力篩選。但是他所在的公司用的技術是基于 unittest 的&am…

Sentinel與SpringBoot整合

好的&#xff0c;以下是一個簡單的Spring Cloud整合Sentinel的代碼示例&#xff1a; 首先&#xff0c;在pom.xml中添加以下依賴&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…

swift-基礎

print區別 print(1,2,3, separator: "-", terminator: "\n")//表示用-來分割//1-2-3 //terminator表示用\n作為終止符 var a "a",b "b" print(a b) //ab print("\(a)前面是a變量\(b)后面是b變量")變量 var name "…

Win10系統無法登錄Xbox live的四種解決方法

在Win10系統中&#xff0c;用戶可以登錄Xbox live平臺&#xff0c;暢玩自己喜歡的游戲。但是&#xff0c;有用戶卻遇到了無法登錄Xbox live的問題。接下來小編給大家詳細介紹四種簡單的解決方法&#xff0c;解決后用戶在Win10電腦上就能成功登錄上Xbox live平臺。 Win10系統無法…

Linux編程 文件操作 creat open

文件描述符 文件描述符在形式上是一個非負整數。實際上&#xff0c;它是一個索引值&#xff0c;指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時&#xff0c;內核向進程返回一個文件描述符。 啟動一個進程之后&#xff0c;…

SquareCTF-2023 Web Writeups

官方wp&#xff1a;CTFtime.org / Square CTF 2023 tasks and writeups sandbox Description&#xff1a; I “made” “a” “python” “sandbox” “”“” nc 184.72.87.9 8008 先nc連上看看&#xff0c;只允許一個單詞&#xff0c;空格之后的直接無效了。 flag就在當…

(C)一些題2

1.在 C 語言中&#xff08;以 16位 PC 機為例&#xff09;,5種基本數據類型的存儲空間長度的順序為&#xff08;&#xff09; A . char < int < long int <float < double B . char int < long int<float <double C . char < int < long int …

inux應用開發基礎知識——串口應用編程(十一)

前言&#xff1a; 在Linux系統中&#xff0c;串口設備以文件的形式存在&#xff0c;通常位于/dev目錄下&#xff0c;如ttyS0、ttyUSB0等。這些設備文件可以用于讀取和寫入數據。要使用串口設備&#xff0c;需要打開相應的設備文件。在打開串口時&#xff0c;可以使用O_RDWR選項…