数据结构 栈 、 队列 、 链表

栈:

  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')

  

 

 



posted @ 2020-12-18 00:14  跳动的W  阅读(69)  评论(0编辑  收藏  举报