• 栈的计算(入栈出栈顺序是否合法)-代码


    1)了解一下栈

    栈可以这么理解:

    一个分层箱子,只有上面有入口。先进入的值必然会到下面。

    而到了向外取值的时候,上面的,也就是后进去的反而先被取了出来,先进入的只能后出。这叫做:“先入后出”。

    2)例题。

    例如,入栈顺序为a,b,c,d,e,求不合法的出栈顺序:

    A. a,b,c,d,e

    B. e,d,c,b,a

    C. a,b,c,e,d

    D. e,c,d,b,a

    情况1)全入,那么出栈顺序为:e,d,c,b,a(B选项),没什么可说的。

    情况2)单入。一个一个入,一个一个取。比如,先入一个值a,然后不在入值,而是先把它取出来,再入b,取b,入c,取c,等等。那么,这样的出栈顺序则变成了a,b,c,d,e。(A选项)

    情况3)先入一部分,取,再入,再取,等等。这部分情况太多,自己理解地去想想吧。

    3)程序实现。

    要想教给程序如何判断这么复杂的情况可能有些困难,但让它“穷举”则能体现出其长处。

    1. #coding=utf-8
    2. class ZHAN(object):
    3. def __init__(self):
    4. self.real=[]
    5. def add(self,other):
    6. self.real.append(other)
    7. def remove(self):
    8. return self.real.pop()
    9. def size(self):
    10. return len(self.real)
    11. def clear(self):
    12. self.real=[]
    13. def everything_out(self):
    14. a=self.real[::-1]
    15. self.clear()
    16. return a
    17. def canout(self):
    18. try:
    19. return self.real[-1]
    20. except IndexError:
    21. return None
    22. def islegal(lt,choose_list):
    23. init=ZHAN()
    24. aa=0
    25. legal=[]
    26. illegal=[]
    27. for i in choose_list:
    28. aa+=1
    29. out=[]#8 25 14 87 51 90 6 19 20
    30. init.clear()
    31. for j in lt:
    32. init.add(j)
    33. try:
    34. while (i[len(out)]==init.canout()):
    35. out.append(init.remove())
    36. except:
    37. pass
    38. print(out)
    39. if len(out)==len(i):
    40. print(f"{aa}合法。")
    41. legal.append(aa)
    42. else:
    43. print(f"{aa}不合法。")
    44. illegal.append(aa)
    45. a=input("进入顺序:")
    46. sp=input("分隔符")
    47. if sp=="":
    48. a=list(a)
    49. else:
    50. a=a.split(sp)
    51. print("选项:(本行不输入内容+换行停止输入)")
    52. b=[]
    53. aa=0
    54. while True:
    55. aa+=1
    56. z=input(f"{aa}项:")
    57. if sp!="":
    58. m=z.split(sp)
    59. else:
    60. m=list(z)
    61. if z!="":
    62. b.append(m)
    63. else:
    64. break
    65. islegal(a,b)

    先创建一个栈的实体数据类型,再进行穷举分析。

    可以来看一下结果:

    1. 进入顺序:abcde
    2. 分隔符
    3. 选项:(本行不输入内容+换行停止输入)
    4. 1:abcde
    5. 2:edcba
    6. 3:abced
    7. 4:ecdba
    8. 5项:
    9. ['a', 'b', 'c', 'd', 'e']
    10. 1合法。
    11. ['e', 'd', 'c', 'b', 'a']
    12. 2合法。
    13. ['a', 'b', 'c', 'e', 'd']
    14. 3合法。
    15. ['e']
    16. 4不合法。

    注意,分隔符处可以什么也不输,直接换行,表示每一个字符都是一个单独的值。

  • 相关阅读:
    Android学习笔记 15. ConstraintLayout 约束布局
    《深入理解BigDecimal:揭秘钱财计算的核心技术》
    C语言扫雷游戏完整实现(下)
    SpringBoot——》配置logback日志文件
    [python-大语言模型]从浅到深一系列学习笔记记录
    顶着高通胀,上涨!上涨!上涨!
    Go - 【字符串,数组,哈希表】常用操作
    Python 基础合集15:修改pip install的安装路径
    Fluent的msh格式网格学习
    牛客--汽水瓶python
  • 原文地址:https://blog.csdn.net/html_finder/article/details/125406234