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

    浏览量

    19729
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40090
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84449
收藏 人收藏

    评论

    相关推荐

    c++之和队列

    stack ,(堆栈),是一种先进后(First In Last Out,FILO)的数据结构,先插入的数据
    的头像 发表于 07-15 08:50 890次阅读
    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 634次阅读
    <b class='flag-5'>数据结构</b>解决滑动窗口问题