三、基本线性结构

本系列博客基于“ (北京大学)数据结构与算法python版”慕课,课程在中国大学慕课和bilibili上均可找到。

1. 内容

  1. 定义线性结构
  2. 讲解栈的结构结构
  3. 栈的应用:简单括号匹配,进制转换,表达式转换(前缀,中缀,后缀)

2. 课程代码

在GitHub中下载

3. OJ作业

所有代码均可在github中下载

3.1 有效的括号

   给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]'的字符串,判断字符串是否有效。
   有效字符串需满足:
   左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。

输入格式: 一行字符串
输出格式:True或False,表示该输入是否为合法括号串

输入样例1:([])
输出样例1:True

输入样例2:{{)]}
输出样例2:False

方法:使用一个栈来保存括号,遍历字符串,遇到左括号则放入栈,遇到右括号,如果栈不空,出栈一个括号判断是否匹配;如果栈空说明不匹配
代码:

class Stack:def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self, item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items)-1]def size(self):return len(self.items)def matches(x1, x2):left = '({['right = ')}]'if left.index(x1) == right.index(x2):return Trueelse:return Falsedef parChecker(symbolString):s = Stack()balanced = Trueindex = 0while index < len(symbolString) and balanced:if symbolString[index] in '({[': # 如果是左括号 推入s.push(symbolString[index])else:                        # 如果是右括号if s.size() == 0:balanced = False  # 栈已空 说明右括号多了else:top = s.pop()  # pop出最顶的元素if not matches(top, symbolString[index]): # 比较左右括号是否匹配balanced = Falseindex += 1if balanced == True and s.isEmpty():return Trueelse:return Falsein_string = input()
print(parChecker(in_string))

3.2 一维开心消消乐

题目内容:
   开心消消乐我们都熟悉,我们可以用刚学过的栈来做一个“一维”的开心消消乐游戏,这个游戏输入一串字符,逐个消去相邻的相同字符对。如果字符全部被消完,则输出不带引号的“None”

输入格式: 一个字符串,可能带有相邻的相同字符,如“aabbbc”
输出格式:一个字符串,消去了相邻的成对字符,如“bc”

输入样例1:beepooxxxyz
输出样例1:bpxyz

输入样例2:kxkx
输出样例2:kxkx

输入样例3:(这里bb被消了以后,第二个a挨上来了,所以两个a也相邻,同样消去)
abbacddccc00
输出样例3:None

方法:输入一串字符串放入列表,如果栈为空,放入一个字母,如果栈有,pop比对两个字母,如果不同则放回两个字母,如果相同,再pop直到遇到不同的字母,再从列表pop直到遇到不同字母。 直到列表为空
    eliminate_game是相同字母不管多少全部消除,比如aaa
    simple_eliminate_game是只消去两个字母,比如aa
代码

class Stack:def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self, item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items)-1]def size(self):return len(self.items)def eliminate_game(in_string):# 输入一串字符串放入列表,如果栈为空,放入一个字母,如果栈有,pop比对两个字母,如果不同则放回两个字母,如果# 相同,再pop直到遇到不同的字母,再从列表pop直到遇到不同字母。  直到列表为空in_string = list(in_string)s = Stack()while len(in_string) > 0:if s.size() > 0:top_char = in_string.pop(0)flag = 0  # 标志是否进入消融while s.size() > 0 and top_char == s.peek():  # 如果和第一个相等,则列表消掉那个值s.pop()flag = 1while len(in_string) > 0 and top_char == in_string[0]:if flag == 1:in_string.pop(0)else:breakif flag == 0:s.push(top_char)else:  # 若s空,把in的第一个数放进去s.push(in_string.pop(0))# 正向输出list_out = []while s.size() > 0:list_out.append(s.pop())list_out.reverse()return list_out# 只消掉成对字符的版本  且是从后往前遍历
def simple_eliminate_game(in_string):in_string = list(in_string)s = Stack()while len(in_string) > 0:top_char = in_string.pop()if s.size() > 0:if top_char == s.peek():s.pop()else:s.push(top_char)else:s.push(top_char)# 正向输出list_out = []while s.size() > 0:list_out.append(s.pop())return list_outin_string = input()
print("".join(eliminate_game(in_string)))
list_out = simple_eliminate_game(in_string)
print("".join(list_out) if len(list_out) > 0 else "None")

3.3 强迫症老板和他的洗碗工

题目内容:
   洗碗工小明碰上了一位强迫症老板老王,餐厅一共就10只盘子,老板给仔细编上了0~9等10个号码,并要求小明按照从0到9的编号来洗盘子,当然,每洗好一只盘子,就必须得整齐叠放起来。
   小明洗盘子期间,经常就有顾客来取盘子,当然每位顾客只能从盘子堆最上面取1只盘子离开。
   老王在收银台仔细地记录了顾客依次取到盘子的编号,比如“1043257689”,这样他就能判断小明是不是遵照命令按照0123456789的次序来洗盘子了。
   你也能像老王一样作出准确的判断吗?

输入格式:
长度为10的字符串,其中只包含0~9的数字,且不重复,代表顾客依次取到的盘子编号
输出格式:
字符串:Yes或者No,表示遵照次序洗盘子,或者没有遵照次序洗盘子

输入样例1:
1043257689
输出样例1:
Yes

输入样例2:
4230178956
输出样例2:
No

方法:取老板记录的编号,从第一个数字开始,在后面小于他的数字,都必须从大到小排列 或者没有用字典来存储 key是比前一个key大的数 键值是key后面比key小的数 用栈来记录键值的顺序 比如1043257689,字典中是1: [0], 4: [3, 2], 5: [], 7: [6], 8: [], 9: []
代码:

class Stack:def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self, item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items)-1]def size(self):return len(self.items)# 规律:取老板记录的编号,从第一个数字开始,在后面小于他的数字,都必须从大到小排列 或者没有
# 用字典来存储  key是比前一个key大的数  键值是key后面比key小的数    用栈来记录键值的顺序
def judge_seq(boss_seq):boss_seq = list(boss_seq)  # 把字符串变成列表split_num = {}key_stack = Stack()key_stack.push(boss_seq[0])for i in range(len(boss_seq)):previous_key = key_stack.peek()  # 之前的keyif int(previous_key) <= int(boss_seq[i]):  # 如果小于的话,加入新的keycurrent_key = boss_seq[i]key_stack.push(current_key)split_num[current_key] = []for item in boss_seq[i:]:  # 对新的key记录比他小的数if int(current_key) >= int(item):  # 如果后面的数小于key 就加入key的表   大于不操作split_num[current_key].append(item)# print(split_num)# 判断是否每一个小的序列都符合降序的要求flag = 'Yes'for key in split_num.keys():value = split_num[key]if len(value) > 1:  # 只需要检查序列长度大于1的sort_value = sorted(value, reverse=True)if sort_value == value:  # 如果value在倒序排的时候,不变,说明就是倒序排列passelse:flag = 'No'return flagboss_seq = input()
print(judge_seq(boss_seq))

数据结构与算法python版 MOOC 第三周相关推荐

  1. 陈斌老师《数据结构与算法Python版》第五周作业——ASCII谢尔宾斯基地毯

    陈斌老师<数据结构与算法Python版>第五周作业--ASCII谢尔宾斯基地毯 题目 思路 程序如下 总结 题目 谢尔宾斯基地毯是形如上图的正方形分形图案,每个地毯可分为等大小的9份,其中 ...

  2. 数据结构与算法 python版 之 递归三定律

    #数据结构与算法 python版 之 谢尔宾斯基三角形 , 树叉 1.为了向阿西莫夫的"机器人三定律"直径,递归算法也总结出"三定律" 1递归算法必须有一个基本 ...

  3. 数据结构与算法python版 MOOC 第九周

    九.树及算法-上 本系列博客基于" (北京大学)数据结构与算法python版"慕课,课程在中国大学慕课和bilibili上均可找到. 1. 内容 树结构的相关术语 树的表示方法:嵌 ...

  4. 数据结构与算法Python版MOOC笔记及练习【七】

    文章目录 什么是顺序查找 算法分析 二分查找 冒泡算法思路 插入排序 谢尔排序 归并排序 快速排序 课程练习 什么是顺序查找 数据项保存在像列表这样的集合中,我们会称这些数据项具有线性或者顺序关系. ...

  5. mooc数据结构与算法python版期末测验_中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案...

    中国大学MOOC(慕课)_数据结构与算法Python版_测试题及答案 更多相关问题 采用fopen()函数打开文件,支持文件读取的参数有: [简答题]简单阐述高分子材料热-机械特征及成型加工的关系,并 ...

  6. mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...

    数据结构与算法Python版-中国大学mooc-试题题目及答案 更多相关问题 婴儿出生一两天后就有笑的反应,这种笑的反应属于(). [判断题]填制原始凭证,汉字大写金额数字一律用正楷或草书书写,汉字大 ...

  7. mooc数据结构与算法python版第十一周作业_中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南...

    中国大学 MOOC_数据结构与算法Python版_2020最新答案学习指南 更多相关问题 [判断题]实际集成运放的上限截止频率为无穷大 [多选题]现代城市的发展凸现出与以往不同的动力机制包括 教师在引 ...

  8. mooc数据结构与算法python版期末测验_中国大学数据结构与算法Python版答案_MOOC慕课章节期末答案...

    中国大学数据结构与算法Python版答案_MOOC慕课章节期末答案 更多相关问题 java.lang 包的 Character 类的 isJavaIdentifierStart 方法的功能是用来判断某 ...

  9. 数据结构python版 答案,中国大学 MOOC_数据结构与算法Python版_章节测验答案

    中国大学 MOOC_数据结构与算法Python版_章节测验答案 更多相关问题 认识的本质是()A.肯定世界是可知的B.主体对客体的能动反映C.主体对客体的直观反映D.实践是 水灰比是影响混凝土()的主 ...

最新文章

  1. 【跟着我们学Golang】之异常处理
  2. 图解全球无人驾驶产业链:这些公司在主宰人类出行的未来
  3. 通信系统中对眼图的理解(二)
  4. UGUI的优点新UI系统
  5. ASP.NET ASHX中获得Session
  6. Python分类模型评估
  7. BCZM : 1.13
  8. MVC-通过对象获取整个表单内容
  9. 黑金Xilinx FPGA学习笔记(一)verilogHDL扫盲文-(1)
  10. 用python语言实现人工智能猴子摘香蕉的问题_人工智能 猴子香蕉问题
  11. C# 写入CSV文件
  12. oracle可恢复的等待,【案例】Oracle RAC恢复报错RMAN-06004 RMAN-20003解决办法笔记
  13. 一文搞定 | Linux 网络子系统
  14. 关于运维的标准(ITSS信息技术服务-运行维护)介绍
  15. PTA 7-1 修理牧场
  16. linux手机+华为,基于Linux打造,华为重磅宣布,开始在6款手机测试新系统
  17. 怎么查看war包代码
  18. Jetson Nano--YoLoV5测试运行--记录
  19. SAP-GR/IR的理解
  20. 【记录】IOS手机如何配置whistle代理进行抓包?(苹果系列)(安卓应该也是类似处理)

热门文章

  1. mysql把日期相减并按照区间范围统计
  2. 在线图片无损放大的方法
  3. python中字符串可以加减乘除吗_Python实现不用加减乘除做加法
  4. 科普名人记(莱昂傅科)
  5. 【GIS开发】Photoshop批处理GIS地图离线瓦片(Python)
  6. 《如果让我重新做一次研究生》王汎森
  7. DataBinder.Eval值的判断
  8. 计算机病毒会破坏计算机网络吗,计算机病毒不会感染和破坏_______。
  9. U3d官方教程——2D UFO
  10. MySQL错误代码对照大全