0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)據(jù)結(jié)構(gòu)中堆棧出棧序列問題解析

454398 ? 來源:碼迷 ? 作者:碼迷 ? 2020-10-19 15:46 ? 次閱讀

這是工作中遇到的小問題。

數(shù)據(jù)結(jié)構(gòu)中有一種數(shù)據(jù)類型——堆棧,該結(jié)構(gòu)中的數(shù)據(jù)項(xiàng)有如下特點(diǎn):

除了最前面和最后面的數(shù)據(jù),每個(gè)數(shù)據(jù)項(xiàng)都有一個(gè)前驅(qū)結(jié)點(diǎn)和一個(gè)后繼結(jié)點(diǎn);

堆棧兩端分別稱為棧頂和棧底,數(shù)據(jù)項(xiàng)只能在棧頂加入或者彈出。

很明顯,堆棧的數(shù)據(jù)遵循先入后出原則。假設(shè)我們有 3 個(gè)不同的數(shù)據(jù)項(xiàng),編號(hào) 1,2,3,只要保證入棧順序是大編號(hào)在后小編號(hào)在前,且每次進(jìn)棧的數(shù)量不限,則所有可能的出棧順序有:1-》2-》3,1-》3-》2,2-》1-》3,2-》3-》1,3-》2-》1 一共 5 種,注意 3-》1-》2 不是可能的出棧順序,因?yàn)槿绻?3 最先出棧,那么 1 和 2 必在棧中(如果還未入棧,則說明 3 先入棧,與假設(shè)矛盾),只能 2 在上 1 在下,所以出棧順序必然是 2-》1。那么,

問題一:編號(hào)\(1\sim n\)的連續(xù)數(shù)據(jù)項(xiàng)以編號(hào)的先后順序入棧然后出棧,所有可能的出棧順序有多少種?

上面的問題比較難于回答,引申之后得到另一個(gè)比較弱的問題

問題二:給定一個(gè)長(zhǎng)度為\(n\) 的整數(shù)序列,且各個(gè)元素均不相同,它是否是一個(gè)出棧序列?

為了回答以上的兩個(gè)問題,我們首先來看下一個(gè)正常的出棧序列有什么特點(diǎn)。假設(shè)長(zhǎng)度為 \(n\)的出棧序列是\(a_1,a_2,…,a_n\),取其中第\(k\) 個(gè)數(shù) \(a_k\),則有如下結(jié)論:

\(a_k\)之前的所有數(shù)據(jù)項(xiàng)都已經(jīng)出棧,即\(a_1,a_2,…,a_{k-1}\)都已經(jīng)出棧;

\(a_k\) 之后的所有數(shù)據(jù)項(xiàng)中,小于 \(a_k\)的都在棧內(nèi),大于\(a_k\)的尚未入棧;

\(a_k\)之后緊跟的出棧數(shù)據(jù)項(xiàng) \(a_{k+1}\) 要么大于\(a_k\),要么是所有未出棧的比\(a_k\)小的數(shù)據(jù)項(xiàng)中最大的一個(gè)

結(jié)論 1 很明顯,因?yàn)楸旧砭褪浅鰲P蛄校虼酥暗臄?shù)據(jù)肯定已經(jīng)出棧;結(jié)論 2 中,之后的數(shù)據(jù)只有兩種存在的可能:在棧內(nèi),或者未進(jìn)棧。比\(a_k\)小的如果未進(jìn)棧,那么 akak 根本不可能出棧(因?yàn)榫蜎]進(jìn)棧),比\(a_k\)大的如果在棧內(nèi),那\(a_k\)也無(wú)法出棧,因?yàn)閈(a_k\)在它的下面,因此得證;結(jié)論 3,\(a_{k+1}\)就是\(a_k\) 出棧后棧頂?shù)臄?shù)據(jù),因此必然是在棧內(nèi)的數(shù)據(jù)的最上面的一個(gè),或者是棧外的某一個(gè)數(shù)據(jù)(進(jìn)棧再出棧)。

于是由結(jié)論 3 找到判斷序列的方法:逐個(gè)檢查序列的每一項(xiàng)\(a_k\),將該項(xiàng)之后的數(shù)據(jù)分為大于該數(shù)據(jù)的大數(shù)集合\(S_g\)和小于該數(shù)的小數(shù)集合\(S_l\),查看是否后續(xù)的數(shù)據(jù)項(xiàng)是小數(shù)集合的最大值或者是大數(shù)集合的任意值,如果不是則不是出棧序列,即若 \(a_{k+1}\in S_g\) 或 \(a_{k+1}=max_l{S_l}\),即是出棧序列。

問題一的解答,就是窮舉長(zhǎng)度為 nn 的序列,逐個(gè)進(jìn)行判斷,得到最后的結(jié)果,附上 python 程序。

import math

import itertools

% 輸入序列的長(zhǎng)度

n = raw_input(“Input n: ”)

% 判斷是否是出棧序列

def IsNotStackSeq(n_ls, n):

for k in range(0,n-2):

% 逐個(gè)檢查序列中的每一個(gè)元素

ak = n_ls[k]

set_in = n_ls[k+1:]

a_max = ak

% 將ak之后的元素分為大于和小于兩組集合

min_list = [item for item in set_in if item 》 ak]

max_list = [item for item in set_in if item 《 ak]

if len(max_list) 》 0:

a_max = max(max_list)

% 后續(xù)的元素是否是小于集合的最大值或者屬于大于集合

if n_ls[k+1] != a_max and (n_ls[k+1] not in min_list):

return 1

return -1

def StackSeqList(n):

n_permation = list(itertools.permutations(range(1,int(n)+1), int(n)))

n_list = [item for item in n_permation if IsNotStackSeq(list(item),int(n)) 《 0]

return (len(n_list),n_list)
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19709
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    569

    瀏覽量

    40063
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4758

    瀏覽量

    84293
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    c++之和隊(duì)列

    stack ,(堆棧),是一種先進(jìn)后(First In Last Out,FILO)的數(shù)據(jù)結(jié)構(gòu),先插入的數(shù)據(jù)
    的頭像 發(fā)表于 07-15 08:50 ?852次閱讀
    c++之<b class='flag-5'>棧</b>和隊(duì)列

    數(shù)據(jù)結(jié)構(gòu)的幾個(gè)重要知識(shí)點(diǎn)

    希望所招入的技術(shù)人員能夠面向數(shù)據(jù)和邏輯,這對(duì)于整個(gè)軟件架構(gòu)來說很重要,而不僅僅是把一段代碼寫好。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合
    發(fā)表于 02-27 15:01

    UCOSIII任務(wù)堆棧和STM32堆棧增長(zhǎng)方向是否一致?

    1.原子哥說:堆棧是在RAM按照“先進(jìn)先出(FIFO)”的原則組織的一塊連續(xù)的存儲(chǔ)空間個(gè)人理解堆棧難道不是的一種,既然如此,的順序應(yīng)該
    發(fā)表于 04-23 03:51

    常見的數(shù)據(jù)結(jié)構(gòu)

    的,那樣對(duì)于數(shù)據(jù)的使用簡(jiǎn)直是個(gè)悲劇。針對(duì)此類數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)提供了圖存儲(chǔ)結(jié)構(gòu),專門用于存儲(chǔ)這類數(shù)據(jù)。二、數(shù)
    發(fā)表于 05-10 07:58

    數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)?b class='flag-5'>棧介紹

    數(shù)據(jù)結(jié)構(gòu)之鏈?zhǔn)?b class='flag-5'>棧鏈?zhǔn)?b class='flag-5'>棧鏈?zhǔn)?b class='flag-5'>棧的定義鏈?zhǔn)?b class='flag-5'>棧操作的實(shí)現(xiàn)鏈?zhǔn)?b class='flag-5'>棧初始化鏈?zhǔn)?/div>
    發(fā)表于 12-17 08:11

    STM32堆棧區(qū)劃分

    STM32堆棧區(qū)(一)一個(gè)由C/C++編譯的程序占用的內(nèi)存分為以下幾個(gè)部分:區(qū)(stack):編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。操作方式類似于數(shù)據(jù)結(jié)構(gòu)
    發(fā)表于 01-20 08:32

    計(jì)算機(jī)堆棧有哪些功能

    在計(jì)算機(jī)領(lǐng)域,堆棧是一個(gè)不容忽視的概念,堆棧是兩種數(shù)據(jù)結(jié)構(gòu)堆棧都是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu)
    發(fā)表于 01-20 06:16

    java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)

    數(shù)據(jù)結(jié)構(gòu)是對(duì)計(jì)算機(jī)內(nèi)存數(shù)據(jù)的一種安排,數(shù)據(jù)結(jié)構(gòu)包括 數(shù)組, 鏈表, , 二叉樹, 哈希表等,算法則對(duì)對(duì)這些
    發(fā)表于 11-29 09:46 ?751次閱讀

    堆和有什么區(qū)別堆棧的詳細(xì)資料說明

    在計(jì)算機(jī)領(lǐng)域,堆棧是一個(gè)不容忽視的概念,但是很多人甚至是計(jì)算機(jī)專業(yè)的人也沒有明確堆棧其實(shí)是兩種數(shù)據(jù)結(jié)構(gòu)。雖然堆棧,堆棧的說法是連起來叫,但是
    發(fā)表于 08-22 17:30 ?0次下載
    堆和<b class='flag-5'>棧</b>有什么區(qū)別<b class='flag-5'>堆棧</b>的詳細(xì)資料說明

    JAVA的堆和介紹和內(nèi)存機(jī)制堆和的區(qū)別及變量在內(nèi)存的分配

    堆棧是 兩種數(shù)據(jù)結(jié)構(gòu)。堆棧都是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu),只能在一端(稱為頂(top))對(duì)
    發(fā)表于 05-09 18:15 ?2次下載
    JAVA的堆和<b class='flag-5'>棧</b>介紹和內(nèi)存機(jī)制<b class='flag-5'>中</b>堆和<b class='flag-5'>棧</b>的區(qū)別及變量在內(nèi)存<b class='flag-5'>中</b>的分配

    什么是?數(shù)據(jù)結(jié)構(gòu)如何實(shí)現(xiàn)

    今天放松一下,我們來看看數(shù)據(jù)結(jié)構(gòu),這節(jié)的知識(shí)點(diǎn)可以說是數(shù)據(jù)結(jié)構(gòu)中最容易上手的知識(shí)點(diǎn)了,其實(shí)比起鏈表,其實(shí)鏈表也有和隊(duì)列的模型,鏈表的
    發(fā)表于 04-29 18:25 ?0次下載
    什么是<b class='flag-5'>棧</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b><b class='flag-5'>中</b><b class='flag-5'>棧</b>如何實(shí)現(xiàn)

    如何解決數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)最大頻率問題?

    讀完本文,可以去力扣解決如下題目: 895.最大頻率(Hard) ? 我個(gè)人很喜歡設(shè)計(jì)特殊數(shù)據(jù)結(jié)構(gòu)的問題,畢竟在工作中會(huì)經(jīng)常用到基本數(shù)據(jù)結(jié)構(gòu),而設(shè)計(jì)類的問題就非??简?yàn)對(duì)基本數(shù)據(jù)結(jié)構(gòu)
    的頭像 發(fā)表于 03-02 11:02 ?1376次閱讀

    PLC編程實(shí)現(xiàn)堆棧功能

    排列的數(shù)據(jù)結(jié)構(gòu)。具有滿、空的屬性, 可以對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行和入
    發(fā)表于 04-17 11:49 ?3次下載
    PLC編程實(shí)現(xiàn)<b class='flag-5'>堆棧</b>功能

    PLC實(shí)現(xiàn)入功能

    使用西門子PLC實(shí)現(xiàn)入的功能,出入順序?yàn)橄热胂瘸? 準(zhǔn)備工作 1. 創(chuàng)建FC塊。入
    發(fā)表于 04-18 10:25 ?1次下載
    PLC實(shí)現(xiàn)入<b class='flag-5'>棧</b><b class='flag-5'>出</b><b class='flag-5'>棧</b>功能

    數(shù)據(jù)結(jié)構(gòu)解決滑動(dòng)窗口問題

    前文用 [單調(diào)解決三道算法問題]介紹了單調(diào)這種特殊數(shù)據(jù)結(jié)構(gòu),本文寫一個(gè)類似的數(shù)據(jù)結(jié)構(gòu)「單調(diào)隊(duì)列」。 也許這種數(shù)據(jù)結(jié)構(gòu)的名字你沒聽過,其
    的頭像 發(fā)表于 04-19 10:50 ?599次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>解決滑動(dòng)窗口問題