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

    文章

    171

    浏览量

    19487
  • 数据结构
    +关注

    关注

    3

    文章

    560

    浏览量

    39895
  • python
    +关注

    关注

    51

    文章

    4667

    浏览量

    83440
收藏 人收藏

    评论

    相关推荐

    数据结构要学吗?

    经常看到很多高手说到堆栈队列这些数据结构的专业名词,可是我并不了解,一直觉得这是计算机专业的同学学的,做控制方面的有必要学吗?
    发表于 07-15 19:44

    数据结构

    的逻辑结构,是指反映数据之间逻辑关系的数据结构。对于电脑上的数据而言,逻辑结构就是能够用眼睛看到的数据
    发表于 03-04 14:13

    Hexagon的软件

    位对齐,这主要是为了堆栈指令能够合适的运行 Hexagon提供的是用来保存框架的,这是一种用于保存程序活跃子程序的状态信息的
    发表于 09-19 17:41

    数据结构试题库,含答案

    如果以链表作为的存储结构,则入操作时()。12. 在队列存取数据的原则是()A. 先进先出 B. 后进先出 C. 先进后
    发表于 03-07 16:19

    数据结构的几个重要知识点

    希望所招入的技术人员能够面向数据和逻辑,这对于整个软件架构来说很重要,而不仅仅是把一段代码写好。数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合
    发表于 02-27 15:01

    嵌入式学习手册——堆栈结构与编程

    我们去理解嵌入式代码执行机制,以及帮助我们进一步去调试。1. 何为堆栈?堆 HEAP 与 STACK 是两个不同概念,其本质上都是一种数据结构。  是一种按
    发表于 04-20 07:00

    UCOSIII任务堆栈和STM32堆栈增长方向是否一致?

    1.原子哥说:堆栈是在RAM按照“先进先出(FIFO)”的原则组织的一块连续的存储空间个人理解堆栈难道不是的一种,既然如此,的顺序应该
    发表于 04-23 03:51

    常见的数据结构

    的,那样对于数据的使用简直是个悲剧。针对此类数据数据结构提供了图存储结构,专门用于存储这类数据。二、
    发表于 05-10 07:58

    请问大神这种数据结构一般如何解析额?

    请问大神,这种数据结构一般如何解析额。。 不太懂。。
    发表于 06-10 09:27

    堆栈是什么

    堆栈是一种数据结构堆栈都是一种数据项按序排列的数据结构,只能在一端(称为顶(top))对
    发表于 08-24 08:16

    数据结构之链式介绍

    数据结构之链式链式链式的定义链式操作的实现链式初始化链式
    发表于 12-17 08:11

    STM32堆栈区划分

    STM32堆栈区(一)一个由C/C++编译的程序占用的内存分为以下几个部分:区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构
    发表于 01-20 08:32

    计算机堆栈有哪些功能

    在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构堆栈都是一种数据项按序排列的数据结构
    发表于 01-20 06:16

    数据结构题解

    数据结构的习题,这是我花了1块钱买的,这了分享一下。
    发表于 02-22 17:50 0次下载

    什么是数据结构?为什么要学习数据结构数据结构的应用实例分析

    本文档的主要内容详细介绍的是什么是数据结构?为什么要学习数据结构数据结构的应用实例分析包括了:数据结构在串口通信当中的应用,数据结构在按键
    发表于 09-26 15:45 14次下载
    什么是<b class='flag-5'>数据结构</b>?为什么要学习<b class='flag-5'>数据结构</b>?<b class='flag-5'>数据结构</b>的应用实例分析