当前位置: 首页 > 编程日记 > 正文

数据结构和算法-栈

栈可以分为

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

空间复杂度

栈的空间复杂度:
有一个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

相关文章:

nodejs 根据坐标 标记图片上的姓名列

1.安装 npm install canvas或者使用cnpm install canvas var { createCanvas, loadImage } require(canvas);function drawImageRemark(imgurl,rects,res) {loadImage(imgurl).then((image) > {console.log(image.width)const canvas createCanvas(image.width, image.h…

以太网控制芯片DM9000在2440裸机上终于能正确接收数据了(源代码工程已经上传)...

以太网控制芯片DM9000在2440裸机上终于能正确接收数据了(源代码工程已经上传) (411.47 K) 该附件被下载次数 168 弄了几天DM9000了,一直不能正确接收数据,郁闷了几天,现在终于行了,高兴一下。 参考了这篇…

ajax post 参数说明

转载于:https://www.cnblogs.com/LuoEast/p/8395086.html

Struts2 2.5版本新配置filter-class

在web.xml 默认代码&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmln…

正则表达式收集

允许为纯英文&#xff0c;数字和汉字及其组合 /^[a-z0-9A-Z\u4e00-\u9fa5]$/ 微信账号 /^(?!_;)(?!.*?_$)[a-zA-Z0-9_;-]{4,23}$/ openid由28位数字或下划线组成 /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]{28}$/

小D学blend-----如何创建自定义的Tooltip控件

运行环境&#xff1a;blend 4.0或者blend 3.0 silverlight 3.0&#xff08;其实我相信步骤应该是差不多的&#xff09; 语言&#xff1a;C# Tooltip类:它是表示一个长方形的小弹出窗口&#xff0c;该窗口在用户将指针悬停在一个控件上时显示有关该控件用途的简短说明。<p&g…

保护SNMP协议服务安全的三个步骤

在启用了SNMP协议服务 情况下&#xff0c;我们如何来确保这个协议的安全呢&#xff1f;首先我们要及时更新这个协议的补 丁&#xff0c;之后还要对这个协议的流程进行过滤。那么具体的实施情况请从下文我们来了解一下吧。 保障SNMP的安全如果某些设备确实有必要运行SNMP,则必须…

使用Python命令创建jenkins的job

目的&#xff1a;通过调用jenkins的命令&#xff0c;动态创建jenkins的job 如何使用&#xff0c;使用Python的脚本&#xff0c;更多API可以进入到官网去查看&#xff0c;http://jenkinsapi.readthedocs.io/en/latest/ 使用Python调用jenkinsAPI&#xff0c;首先需要安装包&…

sublime运行错误

这是由于没有保存文档导致说明&#xff1a;[Finished in 19.4s with exit code 1]-表示执行时间[shell_cmd: python3 -u "/Volumes/B/我的工作文档/case/superman_wap/进单/MSjindan.py"]-表示执行的shell命令[dir: /Volumes/B/我的工作文档/case/superman_wap/进单]…

js 使用filter过滤多重数组

过滤如下数据 var comment_list [{"content":"1111","status":1,"sub_comment_list":[{"content":"11111111","status":1,}] }, {"content":"2222","status":1,"…

一步一步实现自己的模拟控件(9)——消息处理

这次我们将要给Widget增加一些状态&#xff0c;并使其能够接受出消息处理扩展&#xff0c;测试工程中实现了一个按钮的消息处理扩展。 Widget状态&#xff1a; 之前的控件只是绘制了一个边框&#xff0c;并且总是会在窗口中显示。实际上我们往往会希望能够让某个控件显示或者隐…

TWAIN Specification Chapter 4 “Advanced Application Implementation”译——应用程序端的高级实现...

本文是对TWAIN规范的第四章《应用程序端的高级实现》的翻译。因工作需要了解TWAIN&#xff0c;所以顺便译了一下。这是私人工作&#xff0c;您可以参考&#xff0c;但本人不保证不存在翻译的差错或不合宜。如果您发现有不妥的地方&#xff0c;敬请告之我(yedaoq126.com)。 4.1 …

WC2018 CCF程序设计教学比赛记事

WC2018 d5 教师比赛日 亦或者称之为以“递归”为主题的同课异构课程&#xff08;25节课 有8节讲递归&#xff09; 发现强省或者弱省中名校派出的选手还是非常优秀的&#xff0c;这种优秀&#xff0c;从他的教态、自信程度、知识广度都可以看出&#xff0c;但是鉴于是CCF第一…

linux 操作系统级别监控 df 命令

df命令可以查看当前系统磁盘空间的使用情况 命令&#xff1a;df -h du -sh * 查看目录文件暂用磁盘大小 如果磁盘空间不够&#xff0c;需清理磁盘 磁盘速度测试&#xff0c;如果磁盘性能不好&#xff0c;性能测试数据会不准确&#xff08;读写速度&#xff09; 命令&#xff1a…

本地清除电脑缓存后,mongodb数据库无法连接

"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe" --dbpath "D:\worksoftware\MongoDB\Server\4.2\data" mongod安装的目录---dbpath mongod数据存放位置

将动态aspx页面转换成为静态html页面的几种方法

1. 模版法 该方法历史悠久&#xff0c;具体处理流程为采用一个html模版&#xff0c;将其中的关键字替换为我们希望的信息。 优点: 缺点: 所有的信息都要采取字符串批凑的方式来实现&#xff0c;比如需要一个列表&#xff0c;就需要拼凑字符串。问题是开发周期长&#x…

selenium如何操作HTML5的画布canvas上的元素

话不多少&#xff0c;上图如下&#xff0c;下图红色框内是一个html5的画布&#xff0c;我们要像操作右上角的保存和数据视图的时候是无法公共selenium的普通定位操作到的&#xff0c;那该怎么办呢&#xff1f; 我们先new一个Selenium的actions&#xff0c;然后把鼠标移动到这个…

OOP 面向对象 七大原则 (一)

OOP 面向对象 七大原则 &#xff08;一&#xff09; 大家众所周知&#xff0c;面向对象有三大特征继承封装多态的同时&#xff0c;还具有这七大原则&#xff0c;三大特征上一篇已经详细说明&#xff0c;这一篇就为大家详解一下七大原则&#xff1a; 单一职责原则&#xff0c;…

NodeJS 使用redis实现定时执行方法

NodeJS 使用redis实现定时执行任务 文章目录NodeJS 使用redis实现定时执行任务场景使用Redis定时器解决Redis定时器Redis发布订阅操作nodejs代码主意事项场景 用户下订单后&#xff0c;需要在5分钟内完成支付&#xff0c;否则订单关闭&#xff1b;用户在完成订单后&#xff0c…

Javascript获取页面、屏幕尺寸大小参数

Javascript获取获取屏幕、浏览器窗口 &#xff0c;浏览器&#xff0c;网页高度、宽度的大小网页可见区域宽&#xff1a;document.body.clientWidth 网页可见区域高&#xff1a;document.body.clientHeight 网页可见区域宽&#xff1a;document.body.offsetWidth (包括边线的宽)…

linux 进入单用户模式修改root密码

Redhat系统Root密码的修改 一台双系统的机器&#xff0c;忘记redhat 的root密码了。 一。相关方法如下:1. 开机在出现grub画面&#xff0c;按e键 2. 用上下键选中第二项(类似于kernel /boot/vmlinuz-2.4.18-14 ro rootLABEL/) 然后按e键编辑 3. 空格single结果如下&#…

精通Groovy

https://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html https://juejin.im/entry/59bf6376f265da066b394310 groovy for eclipse插件wiki https://github.com/groovy/groovy-eclipse/wiki 转载于:https://www.cnblogs.com/hihtml5/p/8434040.html

C和指针-函数

一个函数的通常形式&#xff1a; type function_name(参数&#xff09; { 代码块&#xff1b; } 在参数里面&#xff1a;变量和类型声明 写空函数备用&#xff01; k&R C中&#xff0c;参数声明不一样 函数声明&#xff1a; 函数原型先写 缺省认定&#xff1a;声明函数原型…

网页生成pdf文件

在此介绍 两种方法。 一个是asppdf&#xff1b;一个是abcpdf。 都是收费的组件。需要注册码&#xff0c;但是也有破解的和trial的。 asppdf:http://www.persits.com/asppdf.exe &#xff08;可以在http://www.asppdf.com/download.html输入一个email获取一个序列号&#xff…

vue中把props中的值赋值给data

父组件 <messageForm createMsgCallback"addCreateMsg" :name"sendForm.name"></messageForm> 子组件 props:{name:{type:String} }, computed: {computedName(){return this.name}},watch:{name:function(val) {console.log(val);this.sen…

Webservices,remoting,WCF比较一下

remoting用的少&#xff0c;再仔细琢磨

eclipse常用插件介绍

1. 测试覆盖率工具&#xff1a;EclEmma https://www.cnblogs.com/Ming8006/p/5811425.html 2. 单元测试系列&#xff1a;如何使用JUnitJaCoCoEclEmma完成单元测试 https://www.cnblogs.com/zishi/p/6726664.html转载于:https://www.cnblogs.com/yelongsan/p/8436281.html

SQL Server基础操作(此随笔仅作为本人学习进度记录七 !--存储过程)

存储过程存储过程分为系统存储过程和自定义存储过程存储过程通过将处理数据的程序从客户端应用程序移动到服务器,存储过程是放在服务器上的&#xff0c;通过客户端下达指令调用存储过程的时候&#xff0c;这个过程是在服务器上发生的&#xff0c;自然就不会占用网络的带宽就会降…

JS基础类型和引用类型

JS基础类型和引用类型脑图

(转)WinForm控件使用文章收藏整理完成

http://home.cnblogs.com/group/topic/29829.html 对C# WinForm开发系列收集的控件使用方面进行整理, 加入了一些文章, 不断补充充实, 完善这方面. 基础 - 常用控件 C# WinForm开发系列 - CheckBox/Button/Label/ProgressBar WinForm下CheckedListBox的数据绑定 Winform 下…