python數據結構與算法第六講_Python 學習 -- 數據結構與算法 (六)

棧 是一種 “操作受限”的線性表,只允許在一端插入和刪除數據。

從功能是上來說,數組和鏈表確實可以替代棧,但是特定的數據結構是對特定場景的抽象,而且,數組或鏈表暴露了太多的操作接口,操作上的確靈活自由,但使用時就比較不可控,自然也就更容易出錯。

當某個數據集合只涉及在一端插入和刪除數據,并且滿足后進先出、先進后出的特性,這時我們就應該首選“棧”這種數據結構。

棧的應用:

函數調用,操作系統給每個線程分配了一塊獨立的內存空間,這個內存被組織成“棧”這種結構,用來存儲函數調用時的臨時變量。每進入一個函數,就會將臨時變量作為一個棧幀入棧,當被調用函數執行完成,返回之后,將這個函數對應的棧幀出棧。

表達式求值

比如 3 + 5 * 8 - 6,編譯器通過兩個棧來實現,其中一個保存操作數的棧,另一個是保存運算符的棧,從左向右遍歷表達式,當遇到數字,我們就直接壓入操作數棧;當遇到運算符,就與運算符棧的棧頂元素進行比較。

如果比運算符棧頂元素的優先級高,就將當前運算符壓入棧;如果比運算符棧頂元素的優先級低或者相同,從運算符棧中取棧頂運算符,從操作數棧的棧頂取2個操作數,然后進行計算,再把計算完的結果壓入操作數棧,繼續比較。

c5c4d42b4389

image.jpeg

在括號匹配中的應用

假設表達式中只包含三種括號,圓括號()、方括號[]和花括號{},并且他們可以任意套裝。比如,{[{}]}為合法格式,而 {[}()] 或 [({)]}為不合法格式,現在檢查其合法性。

用棧來保存未匹配的左括號,從左到右依次掃描字符串。當掃描到左括號時,則將其壓入棧中;當掃描到右括號時,從棧頂取出一個左括號,如果能夠匹配,比如 ) 跟 ( 匹配, [ 跟 ] 匹配,則繼續掃描剩下的字符串,如果在掃描的過程中,遇到不能配對的右括號,或者棧中沒有數據,則說明為非法格式。

當所有的括號都掃描完成之后,如果棧為空,則說明字符串為合法格式;否則,說明有未匹配的左括號,為非法格式。

瀏覽器的前進和后退功能

使用兩個棧,X 和 Y, 把首次瀏覽的頁面一次壓入棧 X, 當點擊后退按鈕時,再一次從棧 X 中出棧,并將出棧的數據一次放入棧 Y。 當我們點擊前進按鈕時,依次從棧 Y 中取出數據,放入棧 X 中。當棧 X 中沒有數據時,那就說明沒有頁面可以繼續后退瀏覽了,當棧 Y 中沒有數據時,說明沒有頁面可以點擊前進按鈕瀏覽了。

比如,順序查看了 a, b, c 三個頁面,依次把 a, b, c 壓入棧,這個時候,兩個棧的數據就是這個樣子:

c5c4d42b4389

image.jpeg

當通過瀏覽器的后退按鈕,從頁面 c 后退到頁面 a 之后,就依次把 c 和 b 從棧 X 中彈出,并且依次放入到棧 Y。 這個時候,兩個棧的數據就是這個樣子:

c5c4d42b4389

image.jpeg

這個時候,如果又想看頁面b,于是又點擊前進按鈕回到b頁面,就把b從棧Y中出棧,放入棧X中,此時,兩個棧的數據就是這個樣子:

c5c4d42b4389

image.jpeg

這個時候,通過頁面b又跳轉到新的頁面d了,頁面 c 就無法再通過 前進、后退按鈕重復查看了,所以需要清空棧 Y。此時兩個棧的數據是這個樣子:

c5c4d42b4389

image.jpeg

總的來說,棧是一種操作受限的數據結構,只支持入棧和出棧操作,后進先出是它最大的特點。棧既可以通過數組實現,也可以通過鏈表來實現。不管是基于數組還是鏈表,入棧、出棧的時間復雜度都為 O(1)。

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

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

相關文章

spring-springmvc code-based

idea設置maven在下載依賴的同時把對應的源碼下載過來。圖0:1主要實現零配置來完成springMVC環境搭建,當然現在有了springBoot也是零配置,但是很多同仁都是從spring3.x中的springMVC直接過渡到springBoot的,spring3.x的MVC大部分都…

powershell 入門_使用PowerShell入門的5個Cmdlet

powershell 入門PowerShell is quickly becoming the preferred scripting language and CLI of Power Users as well as IT Pros. It’s well worth learning a few commands to get you started, so we’ve got 5 useful cmdlets for you to learn today. PowerShellSwift成為…

Part 3: Services

介紹 在第3部分中,我們將擴展應用程序并啟用負載平衡。為此,我們必須在分布式應用程序的層次結構中提升一個級別:服務。 StackServices (你在這里)Container (涵蓋在第2部分中)關于服務 在分布式應用程序中,應用程序的不同部分被稱為“服務”…

mysql ldf文件太大_Linux_數據庫清除日志文件(LDF文件過大),清除日志: 復制代碼 代碼如 - phpStudy...

數據庫清除日志文件(LDF文件過大)清除日志:復制代碼 代碼如下:DECLARE LogicalFileName sysname,MaxMinutes INT,NewSize INTUSE szwzcheck -- 要操作的數據庫名SELECT LogicalFileName szwzcheck_Log, -- 日志文件名MaxMinutes 10, -- Limit on time allowed to …

emwin之錯誤使用控件函數導致死機現象

2018-10-15 導致死機的代碼示例如下 1 /**2 * brief widget ID define3 * {4 */5 6 #define ID_WINDOW_0 (GUI_ID_USER 0x00)7 #define ID_TEXT_0 (GUI_ID_USER 0x01)8 #define ID_TEXT_1 (GUI_ID_USER …

diy感應usb攝像頭拍照_DIY無線感應充電器

diy感應usb攝像頭拍照Courtesy of Instructables user Inducktion shares a very detailed tutorial on how to build a wireless power charger. He explains the impetus behind the project: 由Instructables用戶提供Inducktion分享了有關如何構建無線電源充電器的非常詳細…

ubuntu7.10安裝到3D開啟

累了好幾天,重裝了十幾遍終于把ubuntu7.10搞定到了我自認為完美的狀態了。現在總結一下安裝過程(按操作順序記錄):1.在xp下不管用pqmajac還是其他硬盤分區工具分出10G的空余分區來(實驗階段10G嘗試下)&…

初學者對python的認識_Python初學者列表,python,初識

1.認識列表列表可以放入所有我們目前學習過的數據類型,甚至包括列表2.有關列表的方法、內置函數(設列表的名稱為list)向列表中添加元素:append():list.append(要添加的元素),注意每次只能添加一個元素,被添加的元素自動…

常用模塊之 time,datetime,random,os,sys

time與datetime模塊 先認識幾個python中關于時間的名詞: 時間戳(timestamp):通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運行“type(time.time())”,返回的是float類型。1970年之前的日期無法以此表…

使用aSpotCat控制您的Android應用權限

Viewing the permissions of each installed Android app requires digging through the Manage Applications screen and examining each app one by one — or does it? aSpotCat takes an inventory of the apps on your system and the permissions they require. 要查看每…

xtrabackup備份mysql“ib_logfile0 is of different”錯誤分析

今天用xtrabackup工具完整備份mysql數據庫的時候出現“./ib_logfile0 is of different”錯誤,具體的日志信息如下: 我第一時間查詢了百度和谷歌都沒有找見相對應的答案。決定從錯誤日志入手,上面的日志提示說:mysql數據庫inondb的日志文件的大…

java socket 報文解析_java socket解析和發送二進制報文工具(附java和C++轉化問題)

解析:首先是讀取字節:/*** 讀取輸入流中指定字節的長度* * 輸入流**paramlength 指定長度*return指定長度的字節數組*/public static byte[] readBytesFromTo(byte[] buffer, int from, intlength) {byte[] sub new byte[length];int cur 0;for (int i from; i < length …

Ubuntu防火墻:ufw

原始linux的防火墻是iptables&#xff0c;以為過于繁瑣&#xff0c;各個發行版幾乎都有自己的方案; ubuntu下的防火墻是ufw[ubuntu fireward的縮寫]&#xff0c;centos的防火墻是fireward ubuntu下&#xff1a; 啟用或者關閉防火墻 sudo ufw enable|disable sudo ufw default d…

如何使自己的不和諧機器人

Discord has an excellent API for writing custom bots, and a very active bot community. Today we’ll take a look at how to get started making your own. Discord具有出色的用于編寫自定義機器人的API&#xff0c;以及非常活躍的機器人社區。 今天&#xff0c;我們將探…

?css3屬性選擇器總結

css3屬性選擇器總結 &#xff08;1&#xff09;E[attr]只使用屬性名&#xff0c;但沒有確定任何屬性值 <p miaov"a1">111111</p> <p miaov"a2">111111</p> p[miaov]{background: red;} /*所有屬性為miaov的元素都會被背景變紅&a…

java復合賦值運算符_Java 之復合賦值運算符

1.引入問題切入正題&#xff0c;看下面代碼&#xff0c;結果應該是怎么樣的public class App{public static void main( String[] args ){byte a1 ;int b 10;a ab;System.out.println(a);ab;System.out.println(a);}}這段代碼的執行結果是什么&#xff1f;&#xff1f;2. 執行…

程序代碼初學者_初學者:如何使用熱鍵在Windows中啟動任何程序

程序代碼初學者Assigning shortcut keys to launch programs in Windows is probably one of the oldest geek tricks in the book, but in true geek fashion we are going to show you how to do it in Windows 8. 分配快捷鍵以在Windows中啟動程序可能是本書中最古老的怪胎技…

stevedore——啟用方式

2019獨角獸企業重金招聘Python工程師標準>>> setuptools維護的入口點注冊表列出了可用的插件&#xff0c;但是并沒有為最終用戶提供使用或啟用的方法。 下面將描述用于管理要使用的擴展集的公共模式。 通過安裝方式啟用 對于許多應用程序&#xff0c;僅僅安裝一個擴…

java 重置定時器_可重置Java定時器

我想有一個java.utils.Timer與一個可重置時間在java.I需要設置一次off事件發生在X秒。如果在創建定時器的時間和X秒之間沒有發生任何事情&#xff0c;則事件會正常發生。然而&#xff0c;如果在X秒之前&#xff0c;我決定該事件應該發生在Y秒后&#xff0c;然后我想要能夠告訴定…

C# -- 文件的壓縮與解壓(GZipStream)

文件的壓縮與解壓 需引入 System.IO.Compression; 1.C#代碼&#xff08;入門案例&#xff09; 1 Console.WriteLine("壓縮文件...............");2 using (FileStream fr File.OpenRead("d:\\test.txt"))3 {4 …