首页 > 数据结构和算法-栈

数据结构和算法-栈

栈可以分为

  • 顺序栈: 数组实现
  • 链式栈: 链表实现

空间复杂度

栈的空间复杂度:

有一个n个元素的栈, 在入栈和出栈过程中, 只需要存储一个临时变量存储空间, 所以空间复杂度是O(1)

并不是说栈有n个元素, 空间复杂度就是O(n), 而是指除了原本的空间外, 算法需要的额外空间


栈要满足后进先出(LIFO)的特性, 栈有以下几种方法

  • 判断为空isEmpty
  • 入栈push
  • 出栈pop
  • 返回栈顶元素peek
  • 返回栈大小size
  • 是否是空isEmpty

以下是使用列表来模拟栈的操作

# coding:utf-8class Stack(object):"""模拟栈"""def __init__(self):self.items = []def isEmpty(self):return self.items == []def push(self, item):self.items.append(item)def pop(self):if self.isEmpty():raise Exception('the stack is empty')return self.items.pop()def peek(self):if self.isEmpty():raise Exception('the stack is empty')return self.items[-1]def size(self):return len(self.items)if __name__ == '__main__':s = Stack()s.push('t')s.push('e')s.push('s')assert s.pop() == 's'assert s.peek() == 'e'assert s.pop() == 'e'assert s.pop() == 't'

应用

1. 符号匹配

实现括号匹配来区分符号是否平衡. 如果是开始符号如(, {, [那么就压入栈, 如果碰到结束符号, 则从栈顶弹出元素


class Stack(object):def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):return self.stack.pop()def isEmpty(self):return self.stack == []basic = {')': '(',']': '[','}': '{',
}def test(string):s = Stack()first = basic.values()last = basic.keys()for i in string:if i in first:s.push(i)elif i in last:if s.pop() == basic[i]:continueelse:return Falseelse:continueif s.isEmpty():return Truereturn Falseif __name__ == '__main__':assert test('[hello ( world { === })]') == Trueassert test('kk(dsfd)ll[') == False

2. 求二进制

如数字6(110), 分别用2除6, 求余数, 最后余数反转就是110


class Stack(object):def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):return self.stack.pop()def isEmpty(self):return self.stack == []def binary(num):s = Stack()while num > 0:n = num % 2s.push(n)num = num // 2res = ""while not s.isEmpty():res += str(s.pop())return resif __name__ == "__main__":assert binary(5) == '101'assert binary(8) == '1000'assert binary(9) == '1001'

1634914-20190623172836409-113676237.jpg

转载于:https://www.cnblogs.com/zlone/p/10989181.html

更多相关:

  • 什么是闭包   python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用。   闭包的作用就是让一个变量能够常驻内存。 def count():fs = []for i in range(1, 4):def f():return i*ifs.appen...

  • 最近尝试了一下Android的Gradle打包,发现确实比Ant打包会方便很多,特此记录下来。 注:android的gradle现在插件的版本已经是0.14.3了,对于一些老的方法和api,有一些已经被移除,无法使用(http://tools.android.com/tech-docs/new-build-system/migrati...

  • class str(basestring):"""str(object='') -> stringReturn a nice string representation of the object.If the argument is a string, the return value is the same object."""d...

  • 目录结构: contents structure [-] 类的基本使用专有方法继承单重继承多重继承砖石继承 1.类的基本使用 下面是类使用的一个简单案例, class person:"person 类的描述信息"def __init__(self,name="",age=0):self.name = nameself.age =...

  • 一、反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 python面向对象中的反射:通过字符串的形式操作对象相关的属性。pytho...

  • 一、set集合的方法 set不是特别常用,但是set的一些特性可以方便处理一些特殊情况。 集合(set)是一个无序不重复元素的序列。 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。 创建格式: parame = {value01,va...

  • 1>UITextField实现leftView: self.inputTextField = [[UITextField alloc]initWithFrame:CGRectMake(10, 10, 200, 25)];self.inputTextField.delegate = self;self.inputTextField....

  • /*判断屏幕宽高比是否为16:9*/ function isScreen16to9() {return window.screen.height / window.screen.width === 9 / 16; }...

  • /*关闭、刷新、跳转、离开当前网页前提示*/ onbeforeunload = function () {return false; };  ...

  • let json = {/**判断JSON格式*/ isJSON: function (str) {if (typeof str == "string") {try {var obj = JSON.parse(str);if (typeof obj == "object" && obj) {return true;} else {...

  •   项目结构   index.js //必须要安装否则就别想运行了❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤ //npm i body-parser -D & cnpm i express & cnpm i node-xlsx & cnp...

  • 一、递归 函数    为什么要有函数,提高代码的可读性,避免重复的代码,提高代码的复用性      在函数中能用return的不要print 1、递归的最大深度997 def foo(n):print(n)n+=1foo(n) foo(1) 递归的最大深度 2、修改递归的最大深度     由此我们可以看出,未报错之前能看到的最大数...