精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數據結構中堆棧出棧序列問題解析

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

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

數據結構中有一種數據類型——堆棧,該結構中的數據項有如下特點:

除了最前面和最后面的數據,每個數據項都有一個前驅結點和一個后繼結點;

堆棧兩端分別稱為棧頂和棧底,數據項只能在棧頂加入或者彈出。

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

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

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

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

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

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

\(a_k\) 之后的所有數據項中,小于 \(a_k\)的都在棧內,大于\(a_k\)的尚未入棧;

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

結論 1 很明顯,因為本身就是出棧序列,因此之前的數據肯定已經出棧;結論 2 中,之后的數據只有兩種存在的可能:在棧內,或者未進棧。比\(a_k\)小的如果未進棧,那么 akak 根本不可能出棧(因為就沒進棧),比\(a_k\)大的如果在棧內,那\(a_k\)也無法出棧,因為\(a_k\)在它的下面,因此得證;結論 3,\(a_{k+1}\)就是\(a_k\) 出棧后棧頂的數據,因此必然是在棧內的數據的最上面的一個,或者是棧外的某一個數據(進棧再出棧)。

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

問題一的解答,就是窮舉長度為 nn 的序列,逐個進行判斷,得到最后的結果,附上 python 程序。

import math

import itertools

% 輸入序列的長度

n = raw_input(“Input n: ”)

% 判斷是否是出棧序列

def IsNotStackSeq(n_ls, n):

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

% 逐個檢查序列中的每一個元素

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)

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 堆棧
    +關注

    關注

    0

    文章

    182

    瀏覽量

    19732
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40092
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84453
收藏 人收藏

    評論

    相關推薦

    c++之和隊列

    stack ,(堆棧),是一種先進后(First In Last Out,FILO)的數據結構,先插入的數據
    的頭像 發表于 07-15 08:50 ?893次閱讀
    c++之<b class='flag-5'>棧</b>和隊列

    數據結構的幾個重要知識點

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

    UCOSIII任務堆棧和STM32堆棧增長方向是否一致?

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

    常見的數據結構

    的,那樣對于數據的使用簡直是個悲劇。針對此類數據數據結構提供了圖存儲結構,專門用于存儲這類數據。二、
    發表于 05-10 07:58

    數據結構之鏈式介紹

    數據結構之鏈式鏈式鏈式的定義鏈式操作的實現鏈式初始化鏈式
    發表于 12-17 08:11

    STM32堆棧區劃分

    STM32堆棧區(一)一個由C/C++編譯的程序占用的內存分為以下幾個部分:區(stack):編譯器自動分配釋放,存放函數的參數值,局部變量的值等。操作方式類似于數據結構
    發表于 01-20 08:32

    計算機堆棧有哪些功能

    在計算機領域,堆棧是一個不容忽視的概念,堆棧是兩種數據結構堆棧都是一種數據項按序排列的數據結構
    發表于 01-20 06:16

    java數據結構學習

    數據結構是對計算機內存數據的一種安排,數據結構包括 數組, 鏈表, , 二叉樹, 哈希表等,算法則對對這些
    發表于 11-29 09:46 ?767次閱讀

    堆和有什么區別堆棧的詳細資料說明

    在計算機領域,堆棧是一個不容忽視的概念,但是很多人甚至是計算機專業的人也沒有明確堆棧其實是兩種數據結構。雖然堆棧堆棧的說法是連起來叫,但是
    發表于 08-22 17:30 ?0次下載
    堆和<b class='flag-5'>棧</b>有什么區別<b class='flag-5'>堆棧</b>的詳細資料說明

    JAVA的堆和介紹和內存機制堆和的區別及變量在內存的分配

    堆棧是 兩種數據結構堆棧都是一種數據項按序排列的數據結構,只能在一端(稱為頂(top))對
    發表于 05-09 18:15 ?2次下載
    JAVA的堆和<b class='flag-5'>棧</b>介紹和內存機制<b class='flag-5'>中</b>堆和<b class='flag-5'>棧</b>的區別及變量在內存<b class='flag-5'>中</b>的分配

    什么是?數據結構如何實現

    今天放松一下,我們來看看數據結構,這節的知識點可以說是數據結構中最容易上手的知識點了,其實比起鏈表,其實鏈表也有和隊列的模型,鏈表的
    發表于 04-29 18:25 ?0次下載
    什么是<b class='flag-5'>棧</b>?<b class='flag-5'>數據結構</b><b class='flag-5'>中</b><b class='flag-5'>棧</b>如何實現

    如何解決數據結構設計最大頻率問題?

    讀完本文,可以去力扣解決如下題目: 895.最大頻率(Hard) ? 我個人很喜歡設計特殊數據結構的問題,畢竟在工作中會經常用到基本數據結構,而設計類的問題就非常考驗對基本數據結構
    的頭像 發表于 03-02 11:02 ?1401次閱讀

    PLC編程實現堆棧功能

    排列的數據結構。具有滿、空的屬性, 可以對數據結構進行和入
    發表于 04-17 11:49 ?3次下載
    PLC編程實現<b class='flag-5'>堆棧</b>功能

    PLC實現入功能

    使用西門子PLC實現入的功能,出入順序為先入先出 準備工作 1. 創建FC塊。入
    發表于 04-18 10:25 ?1次下載
    PLC實現入<b class='flag-5'>棧</b><b class='flag-5'>出</b><b class='flag-5'>棧</b>功能

    數據結構解決滑動窗口問題

    前文用 [單調解決三道算法問題]介紹了單調這種特殊數據結構,本文寫一個類似的數據結構「單調隊列」。 也許這種數據結構的名字你沒聽過,其
    的頭像 發表于 04-19 10:50 ?635次閱讀
    <b class='flag-5'>數據結構</b>解決滑動窗口問題