终于开始数据结构的学习。。。拖延症要不得
上一次学习数据结构大约在大学时期,哦吼,完全应试学习,考完忘的干干净净。。。😰
📌数据结构:在计算机中,存储和组织数据的方式。
🌈常见的数据结构
- 数组 💙
- 栈 💚
- 链表 💙
- 图 💙
- 散列表 💙
- 队列 💙
- 树 💙
- 堆 💙
😊 这里先说栈结构
🌈栈结构
🔔 实际开发过程中,数组应该是最常使用的数据结构。那么我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据。但是有些时间,为了实现某些功能,必须对这种任意性加以限制。而栈和队列就是比较常见的受限的线性结构。都知道栈先进后、出队列先进先出的特点,这里先说栈结构。
🌈🌈栈 stack
🎄 是一种受限的线性表,先进后出(LIFO)
🎄 其限制是:允许在表的一端进行插入和删除运算。这一端称为栈顶,相对的,把另一端称为栈底
🎄 LIFO 即 last in first out 表示就是后进入的元素,第一个弹出栈空间。
🎄 向一个栈插入新元素又称作进栈、入栈或压栈,它就是把新元素放到栈顶元素的上面,使之成为新的栈顶元素
🎄 向一个栈删除元素又称作出栈或退栈,它就是把栈顶元素删掉,使之相邻的元素成为新的栈顶元素
🌈🌈函数调用栈
🎄 函数之间相互调用:A调用B,B中又调用C,C中又调用D.
🎄 那样在执行过程中,会先将A压入栈中,A没有执行完,所以不会弹出栈,
🎄 在A的执行过程中调用B,会把B压入栈中,这时候B在栈顶、A在栈底
🎄 如果这时候B可以执行完,那么B会弹出栈。但是B执行完了吗,没有,B又调用了C
🎄 所以C会压栈,并且在栈顶。而C又调用了D,D会压入栈顶。
🎄 所以当前的栈顺序是:栈底A->B->C->D栈顶
🎄 D执行完,弹出栈。C、B、A依次弹出。
🎄 所以我们有函数调用栈的称呼,就来自与它们内部的实现机制。(通过栈实现)
📝例题:
有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列?()
- A. 5 4 3 6 1 2 √
- B. 4 5 3 2 1 6 √
- C. 3 4 6 5 2 1 × 在3、4出栈时,6必然是栈底,5是栈顶,6不可能在5之前出栈
- D. 2 3 4 1 5 6 √
📌可以画图依次走一遍如下图A选项的流程
🌈🌈封装栈结构
这是使用基于数组的方式来实现
- 栈的操作:
- 🎄 push(element): 添加一个新元素到栈顶
- 🎄 pop(): 删除栈顶元素,同时返回被移出的元素
- 🎄 peek(): 返回栈顶元素,不对栈做任何修改
- 🎄 isEmpty(): 如果栈里没有任何元素就返回true,否则返回false
- 🎄 size():返回栈里的元素个数。这个方法和数组的length属性很类似
- 🎄 toString(): 将栈结构的内容以字符串的形式返回
class Stack{
constructor(){
this.items = []
}
push(element){
this.items.push(element)
}
pop(){
return this.items.pop()
}
peek(){
return this.items[this.items.length-1]
}
isEmpty(){
return this.items.length === 0
}
size(){
return this.items.length
}
toString(){
return this.items.join(' ')
}
}
//栈的使用
let s = new Stack()
s.push(10);
s.push(20);
s.push(50);
s.push(100);
s.push(70);
console.log(s);
console.log(s.pop()); // 70
console.log(s.peek()); //100
console.log(s.isEmpty()); //false
console.log(s.size()); //4
console.log(s.toString());//10 20 50 100
🌈🌈栈的应用-十进制转二进制
function dec2bin(decNumber) {
let stack = new Stack()
//因为不确定循环次数,因此这里用while来遍历获取 余数 和下一次运行的数字
while(decNumber > 0){
// 获取余数 推入栈中
stack.push(decNumber%2)
// 获取下一次运行的数字
decNumber = Math.floor(decNumber/2)
}
let binaryString = ''
while (!stack.isEmpty()){
binaryString += stack.pop()
}
return binaryString
}
console.log(dec2bin(10))
console.log(dec2bin(100))
console.log(dec2bin(1000))