队列(Queue)
队列是一种特殊的数组,先进先出原则(例如取号叫号的过程)。queue.push为入队;queue.shift为出队。
代码实现取号和叫号
const divScreen = document.querySelector("#screen");
const btnCreateNumber = document.querySelector("#createNumber"); 这个部分是获取html文件里的元素
const btnCallNumber = document.querySelector("#callNumber");
const spanNewNumber = document.querySelector("#newNumber");
const spanQueue = document.querySelector("#queue");
let n = 0; let queue = [];
//添加取号的的点击事件
btnCreateNumber.onclick = () => {
n += 1; // queue.push(n) queue.push.call(queue, n); //入队
spanNewNumber.innerText = n;
spanQueue.innerText = JSON.stringify(queue); };
//添加点击叫号的点击事件
btnCallNumber.onclick = () => {
if (queue.length === 0) { return; } // const m = queue.shift();
const m = queue.shift.call(queue); //出队
divScreen.innerText = `请 ${m} 号就餐`;
spanQueue.innerText = JSON.stringify(queue); };
栈(Stack)
栈是一种特殊的数组,先进后出原则(例如一行人进入狭长的电梯间,先进入的反而要后出)。push为压栈(进);pop为弹栈(出)
代码举例:调用栈
function f1() {let a =1; return a+f2()}
function f2() {let b =2; return a+f3()} //压栈,弹栈
function f3() {let c =3; return c}
f1()
链表(Linked-List):一个链一个
链表结构
data:value(链表数据)
next:null(下一个链表名 没有的话则为null)
代码实现链表的增删改查
//增加链表节点
const createList = value => {
return createNode(value);
};
const appendList = (list, value) => {
const node = createNode(value);
let x = list;
while (x.next) { x = x.next; }
// x.next === null //x 是最后一个节点
x.next = node;
return node;
};
//删除节点
const removeFromList = (list, node) => {
let x = list; let p = node;
const createNode = value => {
return { data: value, next: null };
};
//遍历链表节点
const travelList = (list, fn) => {
let x = list;
while (x !== null) {
fn(x);
x = x.next;
}
};
const list = createList(10);
const node2 = appendList(list, 20);
const node3 = appendList(list, 30);
const node4 = appendList(list, 40);
travelList(list, node => {
console.log(node.data); });
双向链表
双向链表指每一个节点都有一个previous用来指向上一个节点。
双向链表的结构
data:value(链表数据)
next:null(下一个链表名 没有的话则为null)
previous:填入上一个节点名
循环链表
最后一个节点的next指向链表中的第一个节点,叫做循环链表。