JavaScript-栈结构
栈结构
认识栈结构
栈也是一种非常常见的数据结构,并且在程序中的应用非常广泛,栈的特点是先进后出,后进先出
栈结构示意图
面试题目:
有六个元素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
- D:2 3 4 1 5 6
注意:不是一次性全部进栈,而是进栈途中可以出栈,有进有出
解析:
- A答案:65进栈,5出栈,4进栈出栈,3进栈出栈,6出栈,21进栈,1出栈,2出栈
- B答案:654进栈,4出栈,5出栈,3进栈出栈,2进栈出栈,1进栈出栈,6出栈
- C答案:6543进栈,3出栈,4出栈,之后应该5出栈而不是6,错误;
- D答案:65432进栈,2出栈,3出栈,4出栈,1进栈出栈,5出栈,6出栈。
栈常见的操作:
- push(element):添加一个新元素到栈顶位置;
- pop():移除栈顶的元素,同时返回被移除的元素;
- peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它);
- isEmpty():如果栈里没有任何元素就返回true,否则返回false;
- size():返回栈里的元素个数。这个方法和数组的length属性类似;
- toString():将栈结构的内容以字符串的形式返回。
栈结构的代码实现
class Stack {
constructor() {
// 栈中的属性
this.items = []
}
// 栈的相关操作
push(el) {
//添加一个新元素到栈顶位置
this.items.push(el)
}
pop() {
// 移除栈顶的元素,同时返回被移除的元素
return this.items.pop()
}
peek() {
// 仅返回栈顶的元素
return this.items[this.items.length - 1]
}
isEmpty() {
// 如果栈里没有任何元素就返回true,否则返回false
return this.isEmpty.length === 0
}
size() {
// 返回栈里的元素个数
return this.items.length
}
toString() {
// 将栈结构的内容以字符串的形式返回
// 20 10 8 7 6 5 4 1
let res = ''
for (let i = 0; i < this.items.length; i++) {
res += this.items[i] + ' '
}
return res
}
}
const stack = new Stack()
stack.push(10)
stack.push(5)
stack.push(3)
stack.push(1)
console.log(stack.items);
栈的练习:
将十进制转换成二进制
// 函数:十进制转二进制
function dec2bin(decNumber) {
// 1.定义一个栈对象
const stack = new Stack()
// 2.循环操作
while (decNumber > 0) {
// 2.1.获取余数
stack.push(decNumber % 2)
// 2.2获取整除后的结果,作为下一次使用
decNumber = Math.floor(decNumber / 2)
}
// 3.从栈中取出0和1
stack.items.reverse()
return stack.toString()
}
console.log(dec2bin(100)) // 1 1 0 0 1 0 0