@Hurryliwei “如果实例使用?” 不知道是指什么意思?要不然写段预期的代码效果?
就是举个例子 写段预期的代码效果 这个只是做了一个定义 如何使用呢? 参数如何传递 参数的形式等等 写一个完整的呗 大佬 我有点没懂如何具体情况下使用 传参。
3. 数据结构
首先补一些概念:
数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。
Data_Structure=(D,R),其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合。
数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。
数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,与存储位置无关。
逻辑结构包括:
- 集合,数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系
- 线性结构,数据结构中的元素存在一对一的相互关系
- 树形结构,数据结构中的元素存在一对多的相互关系
- 图形结构,数据结构中的元素存在多对多的相互关系
数据的物理结构:指数据的逻辑结构在计算机存储空间的存放形式。
数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。
数据元素的机内表示(映像方法): 用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据元素有若干个数据项组成时,位串中与个数据项对应的子位串称为数据域(data field)。因此,节点是数据元素的机内表示(或机内映像)。
关系的机内表示(映像方法):数据元素之间的关系的机内表示可以分为顺序映像和非顺序映像,常用两种存储结构:顺序存储结构和链式存储结构。顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像借助指示元素存储位置的指针(pointer)来表示数据元素之间的逻辑关系。
3.1 栈
栈是只能在某一端插入和删除的特殊线性表。遵从后进先出(LIFO,Last In First Out)的原则。一般有以下方法:
- push(element): 添加元素到栈顶
- pop(): 移除并返回栈顶元素
- peek(): 返回栈顶元素
- isEmpty(): 检查栈是否为空,为空则返回true
- clear(): 移除栈中所有元素
- size(): 返回栈中元素个数
JavaScript实现
class Stack { constructor(array) { this.items = Array.isArray(array) ? array : [] } push(el) { this.items.push(el) } pop() { return this.items.pop() } peek() { return this.items[this.items.length - 1] } size() { return this.items.length } clear() { this.items = [] } isEmpty() { return this.items.length === 0 } toString(connector) { return this.items.join(connector == null ? ',' : connector) } }
事实上JS中数组具有pop/push
等方法,已经可以完全表达栈的形式,以上代码也只是基于数组对封装。
应用
如何得到数字的二进制形式?(num.toString(2)
)
正整数转换成二进制就是不断除二取余,然后倒序排列,高位补零。
function convertDecimalToBinary(dec) { dec = Number(dec) if (Number.isNaN(dec)) return '' const stack = new Stack() let n while(dec >= 2) { n = dec % 2 stack.push(n) dec = Math.floor(dec / 2) } stack.push(dec) let binStr = '' while (!stack.isEmpty()) { binStr += stack.pop() } return binStr } console.log(convertDecimalToBinary(9)) // 1001
3.2 队列
一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或“后进后出”的原则组织数据的。
Array的push/shift
方法对应队列的入队和出对,其实也不用有所谓的JS队列实现(还是贴在下面了):
class Queue { constructor() { this.items = [] } enqueue(el) { this.items.push(el) } dequeue() { return this.items.shift() } front() { return this.items[0] } }
2. Android
上 overflow
默认 hidden
且无法改变
即超出容器部分被裁切,细节可看The overflow style property defaults to hidden and cannot be changed on Android。
iOS 可以支持 overflow: visible
等其它值,这点需注意。
尤其是es6 引入了 Spread operator (延展操作符) 后,即使参数是数组,可以使用 call
let params = [1,2,3,4] xx.call(obj, ...params)
- 共 1 页
- 1
DFS没有对环状结构进行处理~
第 6 题:请分别用深度优先思想和广度优先思想实现一个拷贝函数?