国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

0x11 棧

這篇具有很好參考價值的文章主要介紹了0x11 棧。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

0x11 棧

棧是一種“先進后出”的線性數(shù)據(jù)結(jié)構(gòu)。棧只有一端能夠進出元素,我們一般稱這一端為棧頂,另一端為棧底。添加或刪除棧中元素時,我們只能將其插入到棧頂(進棧),或者把棧頂元素從棧頂取出(出棧)。

實現(xiàn)一個棧,支持查找棧中最小值的操作,要求時間復雜度為O(1)

我們可以建立兩個棧,一個棧A記錄原本的數(shù)據(jù),另一個棧B儲存棧A中以棧底開頭的的每段數(shù)據(jù)最小值,就像下面一樣:

A: 9 2 1 5 3 0 2 <—

B: 9 2 1 1 1 0 0 <—

1.表達式計算

棧的一大用途是做算術(shù)表達式的計算。算術(shù)表達式通常有前綴、中綴、后綴三種表達方式。

中綴表達式,我們最常見的表達式,例如:3 * ( 1 - 2 )。

前綴表達式,又稱波蘭式,形如“op A B”,其中op是一個運算符,A,B是另外兩個前綴表達式。例如:* 3 - 1 2。

后綴表達式,有又稱逆波蘭式,形如“A B op”,例如:1 2 - 3 *。

前綴和后綴表達式的值的定義是,先遞歸求出A,B的值,二者再做op運算的結(jié)果。這兩種表達式不需要使用括號,其運算方案是唯一確定的。對于計算機來說,它最容易理解后綴表達式,我們可以使用棧來 O ( N ) O(N) O(N)地求出它的值。

后綴表達式求法

1.建立一個用于存數(shù)的棧,逐一掃描該后綴表達式中的元素。

(1)如果遇到一個數(shù),則把該數(shù)入棧。

(2)如果遇到運算符,就取出棧頂?shù)膬蓚€數(shù)進行運算,然后把結(jié)果入棧。

2.掃描完成后,棧中恰好有一個元素,就是該后綴表達式的值。

如果想要計算機求解我們常用的中綴表達式的值,最快的方式就是把中綴表達式轉(zhuǎn)化成后綴表達式,再使用上述方法求值。這個轉(zhuǎn)化過程同樣可以使用棧來 O ( n ) O(n) O(n)完成。

中綴表達式轉(zhuǎn)化成后綴表達式

1.建立一個用于存運算符的棧,逐一掃描該中綴表達式中的值。

(1)如果遇到一個數(shù),輸出該數(shù)。

(2)如果遇到左括號,把左括號入棧。

(3)如果遇到右括號,不斷取出棧頂并輸出,直到棧頂為左括號,然后把左括號出棧。

(4)如果遇到運算符,只要棧頂符號的優(yōu)先級大于等于新符號,就不斷取出棧頂并輸出,最后把新符號入棧。優(yōu)先級為乘除>加減>左括號。

2.依次取出并輸出棧中所有的剩余符號,最終輸出的序列就是與原中綴表達式等價的后綴表達式。

當然我們也可以不轉(zhuǎn)化成后綴表達式,而是使用遞歸法直接求解中綴表達式的值,其時間復雜度為 O ( N 2 ) O(N^2) O(N2)。

中綴表達式的遞歸求法

目標:求解中綴表達式S[1~N]的值

子問題:求解中綴表達式S的子區(qū)間表達式S[L~R]的值。

1.在L~R中考慮沒有被任何括號包含的運算符:

(1)若存在加減號,選其中最后一個,分成左右兩半遞歸,結(jié)果相加減,返回。

(2)若存在乘除號,選其中最后一個,分成左右兩半遞歸,結(jié)果相乘除,返回。

2.若不存在沒有被任何括號包含的運算符:

(1)若首尾字符是括號,遞歸求解S[L+1~R-1],把結(jié)果返回。

(2)否則,說明區(qū)間S[L~R]是一個數(shù),直接返回。

2.單調(diào)棧

如下圖所示,在一個水平上方有若干個矩形,求包含與這些矩形的并集內(nèi)部的最大矩形的面積(在下圖中,答案就是陰影部分的面積),矩形個數(shù) ≤ 1 0 5 \leq 10^5 105。

0x11 棧,# 0x10 基本數(shù)據(jù)結(jié)構(gòu),算法,數(shù)據(jù)結(jié)構(gòu),c++

如果矩形的高度從左往右遞增,我們可以嘗試每個矩形的高度作為最終矩形的高度,并把寬度延伸到右邊界,得到一個矩形,在所有這樣的矩形中取面積的最大值就是答案。如下圖所示:

0x11 棧,# 0x10 基本數(shù)據(jù)結(jié)構(gòu),算法,數(shù)據(jù)結(jié)構(gòu),c++

如果下一個矩形的高度小于上一個矩形的高度,那么該矩形想利用之前的矩形一起構(gòu)成一塊較大的面積時,這塊面積的高度就不可能超過該矩形自身的高度。換句話說,在考慮完上圖的四種情況后,下圖中打叉的那部分面積就沒有任何用處了。

0x11 棧,# 0x10 基本數(shù)據(jù)結(jié)構(gòu),算法,數(shù)據(jù)結(jié)構(gòu),c++

既然沒有用,就把這些比該矩形高的矩形都刪掉,用一個寬度累加、高度為該矩形自身高度的新矩形(就是上圖的陰影部分)來代替。這樣不會對后續(xù)的計算產(chǎn)生任何影響。于是我們維護的輪廓就變成了一個高度始終單調(diào)遞增的矩形序列。

詳細來說,我們建立一個棧,用來保存若干個矩形,這些矩形的高度是單調(diào)遞增的,我們從左往右依次掃描每個矩形:

如果矩形比當前棧頂矩形高,直接入棧。

否則不斷取出棧頂,直到棧為空或者棧頂矩形的高度比當前矩形小。在出棧過程中,我們累計被彈出的矩形寬度之和,并且每彈出一個矩形,就用它的高度乘上累計的寬度去更新答案。整個出棧過程結(jié)束,我們把一個高度為當前高度、寬度為累計寬度的新矩形入棧。

整個掃描結(jié)束,我們把棧中的剩余矩形依次彈出,按照與上面相同的方法更新答案。為了簡化程序我們也可以增加一個高度為0的矩形a[n+1],以避免在掃描結(jié)束后棧中有剩余矩形。

long long ans=0;
int p=0;
a[n+1]=s[p]=0;
for(int i=1;i<=n+1;++i)
{
    if(a[i]>=s[p])
        s[++p]=a[i],w[p]=1;
    else
    {
        int width=0;
        while(s[p]>a[i])
        {
            width+=w[p];
            ans=max(ans,(long long)width*s[p]);
            --p;
        }
        s[++p]=a[i],w[p]=width+1;
    }
}

這就是著名的單調(diào)棧算法,時間復雜度為 O ( n ) O(n) O(n)。借助單調(diào)性處理問題的思想在于及時排除不可能的選項,保持策略集合的高度有效性和秩序性,從而為我們做出決策提供更多的條件和可能方法。

實際應用:尋找到數(shù)組中一個數(shù)上一個或下一個更大數(shù)或更小數(shù)的位置。一個序列通過單調(diào)棧,我們可以找到序列中數(shù)A前面小于它的第一個數(shù)B。改成遞減排列,也可以找到序列中數(shù)A前面大于它的第一個數(shù)B。也可以通過反向輸入序列,找到序列中數(shù)A后面大于或小于它的第一個數(shù)B。文章來源地址http://www.zghlxwxcb.cn/news/detail-758931.html

到了這里,關(guān)于0x11 棧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Win10 安裝IE11失敗錯誤代碼0x80070490(未解決)

    Win10 安裝IE11失敗錯誤代碼0x80070490(未解決)

    Win 10專業(yè)版 HP臺式機 安裝IE11失敗錯誤代碼0x80070490,點擊“添加功能”,找到 Internet Explorer 11 進行添加,安裝失敗 1.sfc /scnanow 掃描修復(未解決) 2.掃描計算機中系統(tǒng)映像文件與官方系統(tǒng)文件不一致的情況:Dism /Online /Cleanup-Image /ScanHealth(未解決) 查看映像文件損壞的程度

    2024年02月05日
    瀏覽(26)
  • C++11 數(shù)據(jù)結(jié)構(gòu)0 什么是 “數(shù)據(jù)結(jié)構(gòu)“?數(shù)據(jù),數(shù)據(jù)對象,數(shù)據(jù)元素,數(shù)據(jù)項 概念。算法的基本概念 和 算法的度量,大O表示法,空間換時間的代碼

    C++11 數(shù)據(jù)結(jié)構(gòu)0 什么是 “數(shù)據(jù)結(jié)構(gòu)“?數(shù)據(jù),數(shù)據(jù)對象,數(shù)據(jù)元素,數(shù)據(jù)項 概念。算法的基本概念 和 算法的度量,大O表示法,空間換時間的代碼

    是能輸入計算機且能被計算機處理的各種符號的集合。 數(shù)值型的數(shù)據(jù):整數(shù)和實數(shù)。 非數(shù)值型的數(shù)據(jù):文字、圖像、圖形、聲音等。 ? ? ? ? 性質(zhì)相同的 \\\"數(shù)據(jù)元素\\\" 的集合 ? ? ? ? 例如一個 int arr[10],? Teacher tea[3]; 數(shù)據(jù)元素:? ? ? ? ? tea[0],tea[1],arr[2],這些都是 數(shù)據(jù)項:

    2024年04月15日
    瀏覽(25)
  • 示波器探頭x10、x1擋位

    1、x1 信號沒有經(jīng)過衰減進入示波器 2、x10 信號衰減10倍進入示波器 表示示波器讀出來的數(shù)要x10,如果此時示波器也可以設(shè)置為x10檔,直接讀數(shù)即可 。 讀數(shù)方法 設(shè)示波器里面設(shè)置x a,探頭x b,那么最終讀數(shù)放大a/b倍就好了。比如最常用的設(shè)置,示波器里面x10,探頭x10。最終讀

    2024年02月11日
    瀏覽(15)
  • win10/win11家庭版解壓縮時,出現(xiàn)錯誤代碼0x80004005的解決辦法

    win10/win11家庭版解壓縮時,出現(xiàn)錯誤代碼0x80004005的解決辦法

    當時解壓縮的時候出現(xiàn)錯誤代碼0x80004005。 就急吼吼的直接百度錯誤代碼了。試了很多方法,什么用cmd鍵入“regsvr32 softpub.dll”、“regsvr32 wintrust.dll”和“regsvr32 initpki.dll” 這些的 什么弄注冊表的。 全試了個遍,都沒有什么卵用。 還有的說什么家庭策略組,真是服了,都特么

    2024年02月11日
    瀏覽(111)
  • 程序員提效 x10 的必備開源“神器”

    程序員提效 x10 的必備開源“神器”

    工欲善其事,必先利其器。我們每個人的電腦中都會有一些愛不釋手的工具軟件。 轉(zhuǎn)Linux 桌面2年了,期間嘗試過各種各樣“神奇”的開源工具,作為一個開源軟件愛好者,這里給大家推薦幾個這些年工作、學習、生活中常用、跨平臺、免費的開源”神器”~ rime 輸入法框架

    2024年04月14日
    瀏覽(31)
  • 榮耀x10從鴻蒙3.0退回到舊版本MagicUI

    榮耀x10從鴻蒙3.0退回到舊版本MagicUI

    看到之前用的手機榮耀x10,放著吃灰怪可惜,不如裝游戲偶爾玩下,本以為很簡單事情 ,不出意外的出意外了。 手機自帶應用市場沒找到要用的九游app,從官網(wǎng)下載后安裝,結(jié)果提示需要登錄華為賬號,之后才能安裝第三方應用。以前用手機時賬號都是登錄著的,所以沒發(fā)

    2024年02月20日
    瀏覽(16)
  • mac X11 XQuartz的安裝與使用

    本地系統(tǒng):MacOS 12.4 遠程主機系統(tǒng):Ubuntu 18.04 命令說明 ssh命令 ssh 命令大家很熟悉了,這里僅介紹與 X11 forwarding 相關(guān)的幾個選項。 本部分譯自 ssh 命令手冊,可見 man ssh -X :打開 X11 forwarding。也可以通過在 configuration 文件中對每個 host 單獨進行設(shè)置。 應謹慎啟用 X11 forwardi

    2024年02月04日
    瀏覽(17)
  • Ubuntu X11VNC 遠程桌面安裝與使用

    Ubuntu X11VNC 遠程桌面安裝與使用

    通過下載安裝VNC實現(xiàn),遠程操控Linux系統(tǒng),詳細安裝步驟如下: 1.控制端 需下載VNC Viewer,官網(wǎng)地址為:Download VNC Viewer | VNC? Connect 1.1Windows選擇如下: 下載完成后雙擊安裝。 之后全部默認選擇下一步,完成安裝。 點擊搜索欄,輸入vnc ,打開vnc viewer 選擇不登錄進入 此時等待

    2024年02月15日
    瀏覽(29)
  • Ubuntu22.04修改默認窗口系統(tǒng)為X11

    Ubuntu22.04修改默認窗口系統(tǒng)為X11

    Ubuntu22.04安裝默認窗口系統(tǒng)為Wayland(通過設(shè)置-關(guān)于可以看到)。 用戶登錄時,點“未列出”,輸入用戶名后,在登錄界面底部的齒輪圖標中,選擇 \\\"Ubuntu on Xorg\\\" 作為會話類型登錄,系統(tǒng)將為當前會話使用 Xorg。如果每次手動選擇 Xorg 登錄,系統(tǒng)應該記住選擇,并在下次登錄時

    2024年04月12日
    瀏覽(23)
  • 通過X11獲取屏幕截圖并轉(zhuǎn)為opencv Mat

    #include bits/stdc++.h #include \\\"opencv2/core.hpp\\\" #include \\\"opencv2/highgui.hpp\\\" #include \\\"opencv2/opencv.hpp\\\" #include \\\"opencv2/videoio.hpp\\\" #include X11/Xlib.h //-lX11 #include X11/Xutil.h #include X11/Xmd.h #include X11/Xatom.h using namespace std; using namespace cv; Mat getScreenShot() { ? ? Display *dis=XOpenDisplay((char *)0); ? ? Screen *scr = X

    2024年02月15日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包