简介:
栈的特点为先进后出,后进先出(LIFO:last in first out)
经典面试题:
题目:有6个元素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 (√)
题目所说的按顺序进栈指的不是一次性全部进栈,而是有进有出,进栈顺序为6 -> 5 -> 4 -> 3 -> 2 -> 1。
解析:
- A答案:65进栈,5出栈,4进栈出栈,3进栈出栈,6出栈,21进栈,1出栈,2出栈(整体入栈顺序符合654321);
- B答案:654进栈,4出栈,5出栈,3进栈出栈,2进栈出栈,1进栈出栈,6出栈(整体的入栈顺序符合654321);
- C答案:6543进栈,3出栈,4出栈,之后应该5出栈而不是6,所以错误;
- D答案:65432进栈,2出栈,3出栈,4出栈,1进栈出栈,5出栈,6出栈。符合入栈顺序;
常见的栈操作:
- push(element):添加一个新元素到栈顶位置;
- pop():移除栈顶的元素,同时返回被移除的元素;
- peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回他);
- isEmpty():如果栈里没有任何元素就返回true,否则返回false;
- size():返回栈里的元素个数。这个方法和数组的length属性类似;
- toString():将栈结构的内容以字符串的形式返回。
代码实现:
//方法(method):一般是和某一个对象实例有联系的:也就是 array.prototype
//函数(function)
// 封装栈类
function array() {
//栈的属性
this.sum = []
//栈的相关操作
//1.将元素压入栈
// 面向对象,原型链的方式
array.prototype.push = function (a) {
this.sum.push(a)
}
//2.从栈中取出元素
array.prototype.pop = function () {
return this.sum.pop()
}
//3.查看栈顶元素
array.prototype.peek = function () {
return this.sum[this.sum.length - 1]
}
//4.判断栈是否为空
array.prototype.isEmpty = function () {
return this.sum.length == 0
}
//5.获取栈中元素的个数
array.prototype.size = function () {
return this.sum.length
}
//6.tostring方法
array.prototype.toString = function () {
let num = ''
for (let i = 0; i < this.sum.length; i++) {
return num += this.sum[i] + ''
}
return num
}
}
// 栈的使用
let arr = new array()
arr.push(10)
arr.push(11)
arr.push(12)
arr.push(13)
arr.pop()
console.log(arr.peek())
console.log(arr.isEmpty())
console.log(arr.size())
console.log(arr.toString())
2.十进制转二进制
过程:
//函数:将十进制转成二进制
function two(ten) {
//1.定义一个栈对象
let aray = new array()
// 2.循环操作
while (ten > 0) {
//2.1获取余数,并且放到栈中
aray.push(ten % 2)
//2.2获取整除之后的结果,作为下一次运行的结果
ten = Math.floor(ten / 2)
}
let obj = ''
while (!aray.isEmpty()) {
obj += aray.pop()
}
return obj
}
//测试十进制转二进制的函数
console.log(two(100))