数据结构 栈 、 队列 、 链表
栈:
1.线性结构(有顺序)
2.可以存储多个元素
3.有入栈、出栈
4.有栈顶
5.不关注元素的下标
6.后进先出
属性和方法:
1.入栈push
2.出栈pop
3.获取栈顶peek
4.获取栈的长度len
5.清空栈clear
js模拟栈
class Stack {
constructor() {
this.stack = []
}
push(ele) { //返回添加的数据
this.stack.push(ele)
return ele
}
pop() { //获取最后一条数据
return this.stack.pop()
}
len() { //获取长度
return this.stack.length
}
peek() {
// 获取栈顶 => 数组的最后一项
return this.stack[this.len() - 1]
}
clear() { // 清空栈
this.stack.length = 0
}
}
站的案例:
十进制转二进制
回文字符串
括号是否匹配
迷宫
网站历史记录(返回上一页)
斐波那契数列
十进制转二进制例:
function decToBinary(num) {
const s = new Stack()
while(num > 0) {
s.push(num % 2)
num = Math.floor(num / 2) //从新复制继续往下转
}
let str = ''
while(s.len() > 0) {
str += s.pop() //由于顺序颠倒需调转顺序生成正确十进制
}
return str
}
decToBinary(45) //101101
数组的结构(特点):
1.是一段连续的内存
2.存储的同类型的数据
3.数组的长度是固定的
4.通过下标访问
5.搜索和查找很方便(通过下标)
6.插入和删除很麻烦(牵一发而动全身)
队列:
1.线性结构
2.先进先出(First ln First Out,FIFO)
队列的属性和方法
1. enquele (ele)进入队列:像队列尾部添加
2. dequeue ()出队:移除队列的第一个元素,并返回被移除的元素。
3. front()返回队列的第一个元素,只返回不出队
4. isEmpty():判断队列是否为空
5. Size():返回队列包含元素个数
队列案例
击鼓传花
原规则:所有学生围成一圈,从某位同学手里开始向旁边的同学传递花,某个人在击鼓,当鼓声停下的那一刻,花落在谁手里,谁表演节目
修改后游戏规则:所有学生围成一圈,开始数数,数到某个数字的人自动淘汰,最后剩下的这个人会获得胜利,问最后剩下的是谁?
js模拟队列
class Queue{
constructor() {
this.queue = []
}
enqueue(element) { //从末尾添加数据
this.queue.push(element)
return element
}
dequeue() { //获取第一个数据
return this.queue.shift()
}
front() { //返回第一个
if(this.queue.length > 0) {
return this.queue[0]
} else {
return undefined
}
}
isEmpty() { //检测是否有数据
return this.queue.length > 0
}
size() { //返回总长度
return this.queue.length
}
}
let nameList = ['刘猛', '黄乾坤', '刘昭阳', '康亚宁', '赵坚', '杨智宇', '刘晨曦', '孟令辉']
function pass(nameList, num) {
let que = new Queue() //实例化
for (let i = 0; i < nameList.length; i++) {
que.enqueue(nameList[i]) //生成队列
}
while (que.size() > 1) { //判断队列是不是剩一个不是就一直循环
for (let i = 0; i < num; i++) {
que.enqueue(que.dequeue())
//拿出第一个放到队列后边循环完形成新队列,当i等于num时停止循环
// 如果长度大于一继续循环
}
que.dequeue()
}
return que.front()
}
console.log(pass(nameList, 4)) //刘昭阳
链表:
class Node {
constructor(data) {
this.data = data
this.next = null
}
}
class LinkNode{
constructor() {
this.head = null
this.count = 0
}
push(data) { //从末尾添加
let node = new Node(data)
if(!this.head) {
// 头结点为空
this.head = node
} else {
let current = this.head
while(current.next) {
current = current.next
}
current.next = node
}
this.count++
}
get(index) { //查找某一项
if(index >= this.count) {
return undefined
} else {
let current = this.head
for(let i =0; i< index; i++) {
current = current.next
}
return current.data
}
}
set(index, data) { //设置、修改某一项
if(index >= this.count) {
return false
} else {
let current = this.head
for(let i =0; i< index; i++) {
current = current.next
}
current.data = data
return true
}
}
remove(index) { //删除某一项
if(index >= this.count) {
return false
} else {
let current = this.head
let previous = null
for(let i =0; i< index; i++) {
previous = current
current = current.next
}
previous.next = current.next
this.count--
}
}
insert(index, data) { //从中间的摸个位置添加一项
if(index >= this.count) {
return false
} else {
let node = new Node(data)
let current = this.head
let previous = null
for(let i =0; i< index; i++) {
previous = current
current=current.next
}
previous.next = node
node.next=current
this.count++
return true
}
}
}
let link = new LinkNode()
link.push(1)
link.push(2)
link.push(3)
console.log(link)
查找某一项
console.log(link.get(2)) // 3
修改某一项的值
link.set(2,'a')
删除某一项
link.remove(1)
在某个位置添加一项
link.insert(2,'b')