数据结构与算法(6)——栈Stack

我们两清 提交于 2020-03-26 02:29:11
  • 基础定义

什么是栈:栈是一种有次序的数据项集合。在栈中,数据项的加入和移除都仅仅发生在同一端,这一端叫栈顶(top),没有操作的另一端叫栈底(base)。

特性:后进先出,先进后出

  • 栈的基本操作

这里需要知道在python里面是没有栈的,但是我们可以模拟一个栈。

首先我们需要定义的一些栈的基本操作:

Stack() 创建一个空栈,不包含任何数据项
push(item) 将item加入栈顶,无返回值
pop() 将栈顶数据项移除,并返回,栈被修改
peek() 查看栈顶数据项,返回栈顶数据项但不移除,且不修改栈
isEmpty() 返回栈是否为空
size() 返回栈中有多少个数据项

 

 

 

 

 

 

 

 

这里,我们可以用list类型实现一个栈的操作:

 1 class Stack:
 2     '''
 3     自己定义的一个栈
 4   栈顶是尾端,也可以将栈顶设为尾端
 5     '''
 6     def __init__(self):
 7         self.items =[]
 8     def isEmpty(self):
 9         return self.items==[]
10     def push(self,item):
11         self.items.append(item)
12     def pop(self):
13         self.items.pop()
14     def peek(self):
15         return self.items[len(self.items)-1]
16     def size(self):
17         return len(self.items)
18 if __name__ == '__main__':
19     s = Stack()
20     s.push('1')
21     s.push('a')
22     print(s.isEmpty())
23     print(s.peek())
24     print(s.size())
1 [out]:
2 False
3 a
4 2
5 
6 Process finished with exit code 0

 

  • 栈的应用
  1. 简单括号匹配

任务:对括号左右对应匹配,构造一个括号匹配算法。从左到右扫描括号,最新打开的左括号,应该匹配最先遇到的右括号 

流程图:

 

 

 代码:

 1 from Stack import Stack
 2 def parChecker(symbolString):
 3     s = Stack()
 4     balanced = True
 5     index = 0
 6     while index < len(symbolString) and balanced:
 7         symbol = symbolString[index]
 8         if symbol == "(":
 9             s.push(symbol)
10         else:
11             if s.isEmpty():
12                 balanced = False
13             else:
14                 s.pop()
15         index = index + 1
16     if balanced and s.isEmpty():
17         return True
18     else:
19         return False
20 print(parChecker('((()))))'))
21 print(parChecker('(((())))'))
[OUT]:1 False
2 True
3 
4 Process finished with exit code 0

但是在实际应用中,括号往往比较复杂,比如{}()[]

参考:https://www.bilibili.com/video/BV1QJ411w7bB?p=17

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!