栈结构
学习栈结构之前,补充数组结构. 比如java的ArrayList)
- 常见语言的数组不能存放不同的数据类型,因此所有在封装时通常存放在数组中的是Object类型
- 常见语言的数组容量不会自动改变.(需要进行扩容操作)
- 常见语言的数组进行中间插入和删除操作性能比较低
数组是一种线性结构, 并且可以在数组的任意位置插入和删除数据. 但是有时候我们为了实现某些功能, 必须对这种任意性加以限制. 而栈和队列就是比较常见的受限的线性结构
认识栈结构
栈(stack),它是一种受限的线性表,后进先出LIFO
- 限制是仅允许在其一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
- LIFO(last in first out)表示就是后进入的元素,第一个弹出栈空间.类似于自动餐托盘,最后放上的托盘,往往先把拿出去使用
- 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素
- 从一个栈删除元素又称作出栈、弹栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈面试题
正确答案: C
C选项的剖析:
- 先依次压入: 6 5 4 3
- 3出 4出 6不能出,5在栈顶
栈结构的封装-js
function Stack() {
// 栈中的属性
this.items = [];
// 栈的操作
// 1.将元素压入栈
Stack.prototype.push = function (element) {
this.items.push(element);
};
// 2.从栈中取出元素 (删除栈顶元素,返回被删除的对象)
Stack.prototype.pop = function () {
return this.items.pop();
};
// 3.查看栈顶元素
Stack.prototype.peek = function () {
return this.items[this.items.length - 1];
};
// 4.判断栈是否为空
Stack.prototype.isEmpty = function () {
return this.items.length === 0;
};
// 5.获取栈中元素的个数
Stack.prototype.size = function () {
return this.items.length;
};
// 6.toString方法
Stack.prototype.toString = function () {
var arrStr = "";
for (const item of this.items) {
arrStr += item + " ";
}
return this.items.toString();
};
}
// 栈的使用
// var s = new Stack();
// s.push(13);
// s.push(153);
// s.push(99);
// alert(s);
// s.pop();
// s.pop();
// alert(s);
// alert(s.peek);
// alert(s.isEmpty());
// alert(s.size());
// 封装函数: 将十进制转为二进制
function dec2bin(decNumber) {
var stack = new Stack();
while (decNumber > 0) {
// 获取余数,放入到栈中
stack.push(decNumber % 2);
// 获取整除后的结果,作为下一次的值
decNumber = Math.floor(decNumber / 2);
}
var binStr = "";
while (!stack.isEmpty()) {
binStr += stack.pop();
}
return binStr;
}
const result = dec2bin(10);
alert(result);