JavaScript栈数据结构算法思想

JavaScript栈数据结构算法思想


栈的介绍

  • 栈(stack)又名堆栈,它是一种运算受限的线性表,仅在表尾能进行插入和删除操作。这一端被称为栈顶,相对的另一端被称为栈尾。
  • 向一个栈中插入一个元素又称作进栈、入栈或压栈;从一个栈删除元素又称作出栈或退栈。
  • 后进先出(LIFO)特点:栈中的元素,最先进栈的必定最后出栈,后进栈的一定会先出栈。

JavaScript中,栈可以用数组模拟。需要限制数组只能使用push()和pop()方法,不能使用unshift()和shift()方法。即为,数组尾就是栈顶。当然用面向对象等手段,将栈封装会更好。

下面用mustache模板引擎的部分原理来举个例子:

const domstr = `<div>
			        <ol>
			          {{#students}}
			          <li>
			            学生{{name}}的爱好是
			            <ol>
			              {{#hobbies}}
			              <li>{{.}}</li>
			              {{/hobbies}}
			            </ol>
			          </li>
			          {{/students}}
			        </ol>
   				</div>`
   				
[ // 该数组是由上面的 dom 字符串处理所得,具体处理这里不做讲解
	[ "text", "<div><ol>" ],[ "#", "students"],[ "text", "<li>学生" ],[ "name", "name" ],[ "text", "的爱好是<ol>" ],[ "#", "hobbies"],[ "text", "<li>" ],[ "name", "." ],[ "text", "</li>" ],[ "/", "hobbies" ],[ "text", "</ol></li>" ],[ "/", "students" ],
	[ "text", "</ol></div>" ]
]

现在要做的就是按照规律,把上面的数组变为有层级关系的数组,如下面所示:

[
	[ "text", "<div><ol>" ],[ "#", "students", [
		[ "text", "<li>学生" ],
		[ "name", "name" ],
		[ "text", "的爱好是<ol>" ],
		[ "#", "hobbies", [
			[ "text", "<li>" ],
			[ "name", "." ],
			[ "text", "</li>" ]
		]],
		[ "text", "</ol></li>" ]
	]],
	[ "text", "</ol></div>" ]
]

具体实现思路,就用了栈数据结构算法思想,因为栈结构的入栈出栈可以形成层级结构。层级最高的在栈底,依次向上,先对栈顶元素进行处理,处理完再整合到下一层,直到处理完毕,和递归有点相似。

具体代码如下:

function nestTokens(tokens) {
  // 结果数组
  var nestedTokens = []
  // 栈容器
  var sections = []
  // 收集器,收集栈顶的元素,初始化为结果数组,因为其层级最高
  var collector = nestedTokens
	
	// 循环tokens中的每一项
  for (let i = 0; i < tokens.length; i++) {
    const token = tokens[i] // 接受第i项

    switch (token[0]) { // 判断层级结构的标志
      case '#': // 为 # 时,入栈,增加一层层级
        collector.push(token) // 标记栈顶元素
        sections.push(token) // 元素入栈
        collector = token[2] = [] // 向数组第三项添加层级
        break
      case '/': // 为 / 时,出栈,减少一层层级
        let section = sections.pop() // 元素出栈
        // 判断栈中是否还有元素,重新标记栈顶元素
        collector = sections.length > 0 ? sections[sections.length - 1][2] : nestedTokens
        break
      default:
      	// 其他情况直接向栈顶添加元素即可,因为上述两种判断栈顶会跟随变化
        collector.push(token)
    }
  }
  // 返回结果数组
  return nestedTokens
}

初学者大坑:栈的题目和递归非常像,这类题目感觉用递归解题,信心满满的开始写,结果发现递归怎么也递归不出来,此时就要想到,不是用递归,而是用栈!
个人分析用哪种的方法:

  1. 已经是对象或数组形式,有规律的层级结构,要转变为其他形式,优先考虑 递归
  2. 如果是字符串形式,拥有层级关系的规律,要转变为数组或对象形式的结构,优先考虑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 高级程序员需要掌握以下几个知识体系: 1. Java 语言基础:包括语法、数据类型、控制结构、面向对象编程等。 2. 集合框架:Java 的集合框架是 Java 编程中非常重要的一部分,要求高级程序员对其熟练掌握。 3. 多线程:Java 中的多线程编程对于开发高性能的程序是非常重要的,高级程序员需要掌握多线程的实现方法以及常见的线程问题。 4. IO 流:Java 中的 IO 流用于读写数据,是编写高效程序的必备技能。 5. 网络编程:Java 是一种网络编程的首选语言,高级程序员需要掌握网络编程的方法,以及如何创建客户端/服务器应用程序。 6. 数据库编程:Java 编程中,数据库编程是非常重要的一部分,高级程序员需要掌握如何使用数据库,以及如何使用 Java 进行数据库编程。 7. 设计模式:设计模式是高级程序员必备的知识,学习设计模式可以帮助编写出优秀、易维 ### 回答2: Java是一种跨平台的编程语言,在进行高级程序开发时,需要掌握一系列的知识体系。下面我将详细介绍Java高级程序员需要掌握的知识体系结构。 1. Java语言基础:学习Java语言的核心特性,包括基本语法、数据类型、运算符、流程控制、异常处理等。理解Java面向对象的特性,如封装、继承、多态等,同时熟悉Java内存管理和垃圾回收机制。 2. 数据结构算法:掌握常见的数据结构,如数组、链表、、队列、树、图等,理解它们的原理和应用场景,并能够分析和解决常见的算法问题。 3. 多线程与并发:熟悉Java多线程编程,了解线程的生命周期、同步与互斥、线程安全等概念。掌握Java提供的线程相关的API和工具,能够编写高效、安全的多线程代码。 4. 网络编程:掌握Java网络编程的基本知识,包括Socket编程、TCP/IP协议、HTTP协议等。理解网络通信的原理,并能够开发基于网络的应用程序。 5. 数据库与持久化:熟悉关系型数据库的基本原理和常用操作,如SQL语句编写、事务控制、索引等。了解Java的持久化技术,如JDBC、Hibernate、MyBatis等,能够进行数据库的连接和操作。 6. 设计模式:熟悉常见的设计模式,如单例模式、工厂模式、观察者模式等,理解它们的应用场景和实现原理,能够根据需求选择和应用适当的设计模式。 7. 框架与中间件:熟悉常用的Java框架和中间件,如Spring、Spring MVC、Spring Boot、MyBatis等,能够利用这些框架快速开发高效、可维护的应用程序。 8. 性能调优与监控:掌握Java性能调优的基本方法和工具,能够定位和解决应用程序的性能瓶颈,并进行性能调优优化。了解监控工具的使用,能够进行应用程序的监控和故障排查。 总之,Java高级程序员需要具备扎实的Java语言基础,熟悉常用的开发工具和框架,同时还需要理解计算机基础知识和软件工程原理,能够设计和开发复杂的应用程序,并具备分析和解决实际问题的能力。 ### 回答3: Java高级程序需要掌握以下知识体系: 1. 面向对象编程(OOP):理解面向对象编程的基本概念、原则和思想,包括封装、继承和多态等概念。掌握类、对象、方法、属性、接口等概念和使用。 2. Java核心库:熟悉Java标准库的各个模块,如集合框架、多线程、输入输出、异常处理等。熟悉常用的类和接口,并能灵活运用它们解决问题。 3. 设计模式:掌握常见的设计模式,如单例模式、工厂模式、观察者模式等。了解它们的原理和应用场景,能够用设计模式来解决实际问题。 4. 数据库和SQL:熟悉数据库的基本概念和操作,了解SQL语言的基本语法。能够通过Java程序与数据库进行交互,实现数据的增删改查操作。 5. Web开发:掌握基本的前端开发技术,比如HTML、CSS、JavaScript等。熟悉Java Web开发的框架和技术,如Servlet、JSP、Spring MVC等。了解HTTP协议和前后端交互的原理。 6. 网络编程:理解网络编程的基本概念和原理,能够使用Java进行网络通信。了解TCP/IP协议、Socket编程等相关技术。 7. 并发编程:了解并发编程的基本概念和原理,能够正确地使用多线程和锁机制。熟悉Java中的线程池、同步工具等并发编程相关的类和接口。 8. 性能调优:了解性能调优的基本原则和方法,能够对Java程序进行性能分析和优化。熟悉Java中的性能调优工具和技术。 9. 安全性:了解Java程序安全性的相关知识,包括防止代码注入、数据加密等。理解常见的安全漏洞和攻击方式,并能够采取相应的安全措施。 10. 测试和调试:熟悉测试和调试的基本原则和方法,能够编写有效的单元测试和集成测试。熟练使用调试工具,能够快速定位和解决程序中的问题。 总结起来,Java高级程序员需要掌握面向对象编程、Java核心库、设计模式、数据库和SQL、Web开发、网络编程、并发编程、性能调优、安全性以及测试和调试等知识体系。这些知识体系构成了Java高级程序员的核心能力,能够帮助他们设计、开发和维护复杂的Java应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值