javascript数据结构-栈
本文最后更新于:8 个月前
本博客参考于洛伊安妮·格罗纳编著的javascript数据结构与算法第三版及codeWay老师视频或其他博客资料,在此对此表示感谢!
栈的概述
栈是一种遵循后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保留在栈的一端,称作栈顶,另一端就叫栈底。
在栈里,新元素都靠近栈顶,旧元素都靠近栈底。在现实生活中有很多栈的例子。例如,在图书馆中有一摞书。你想要拿到下面的就只能先拿走上面的书。栈在编程中用作内存中保存变量、方法调用等等,也被用于浏览器历史记录(浏览器返回按钮)
如何创建一个栈
栈的创建是有两种方式,一种是基于数组,一种是基于链表,这里我们讲基于数组的栈,在链表会在数据结构链表那章博客讲到
- 首先我们需要创建一个stack.js文件,在其中声明Stack类或者stack构造函数这样我们的一个栈就构造好了,之后我们需要添加一些方法,来保存数据或删除,这里的方法有部分本质上就是数组的方法
1
2
3
4function stack(){
//定义一个数组
this.items=[];
}栈顶构造函数的一些方法
- 添加一个或多个元素到栈顶—push(element(s))
1
2
3
4//将元素压入栈
push(element){
this.items.push(element);
} - 移出栈底元素–pop()
1
2
3
4//将元素从栈中取出
pop(){
return this.items.pop();
} - 返回(查看)栈顶元素,不对栈顶元素做修改–peek()
1
2
3
4//查看栈顶元素
peek(){
return this.items[this.items.length-1];
} - 判断栈中是否具有元素(是否为空)–isEmpty()
1
2
3
4//判断栈是否为空
isEmpty(){
return (this.items.length==0);
} - 移出栈里所有元素
1
2
3
4//判断栈是否为空
clear(){
this.items=[];
} - 查看栈中的元素个数–size()
1
2
3
4//判断栈元素个数
size(){
return this.items.length;
}基于栈的方法定义了栈的构造函数
一般我们将构造函数的方法放到原型上1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37/* 创建栈的构造函数 */
function Stack(){
//定义一个数组
this.items=[];
//将元素压入栈
Stack.prototype.push=function(element){
this.items.push(element);
}
//将元素从栈中取出
Stack.prototype.pop=function(){
return this.items.pop();
}
//查看栈顶元素
Stack.prototype.peek=function(){
return this.items[this.items.length-1];
}
//判断栈是否为空
Stack.prototype.isEmpty=function(){
return (this.items.length==0);
}
//清空栈
Stack.prototype.clear=function(){
this.items.length=[];
}
Stack.prototype.size=function(){
return this.items.length;
}
//toString方法
Stack.prototype.toString=function(){
let resultString="";
//遍历栈
for(var i=0;i<this.items.length;i++){
resultString +=this.items[i]+"";
}
return resultString;
}
}Stack构造函数的使用
1
2
3
4
5
6
7
8
9
10
11
12
13const stack=new Stack()
console.log(stack.isEmpty()) //输出为true
stack.push(5);
stack.push(8);
//调用peek方法,将输出8,因为它是往栈里添加最后一个元素
console.log(stack.peek()) //输出8
//再添加一个元素
stack.push(11);
//输出元素个数
console.log(stack.size()) //输出3
//再添加一个元素
stack.push(15)用栈来解决问题
- 十进制与转化为二进制用栈来实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52/* 编写十进制转化为二进制的函数 */
function dec2bin(decNumber){ //decNumber为传入的十进制数
/* 创建栈的构造函数 */
function Stack(){
//定义一个数组
this.items=[];
//将元素压入栈
stack.prototype.push=function(element){
this.items.push(element);
}
//将元素从栈中取出
stack.prototype.pop=function(){
return this.items.pop();
}
//查看栈顶元素
stack.prototype.peek=function(){
return this.items[this.items.length-1];
}
//判断栈是否为空
stack.prototype.isEmpty=function(){
return (this.items.length==0);
}
//toString方法
stack.prototype.toString=function(){
let resultString="";
//遍历栈
for(var i=0;i<this.items.length;i++){
resultString +=this.items[i]+"";
}
return resultString;
}
}
//实例化stack类
var stack=new Stack();
//如果不为空,取余
while(decNumber>0){
stack.push(decNumber % 2);
decNumber=Math.floor(decNumber/2);
}
//从栈中取出元素
var binaryString="";
//循环遍历取出元素
while(!stack.isEmpty()){
binaryString+=stack.pop();
}
console.log(binaryString)
return binaryString;
}
//调用十进制转化为二进制方法
console.log(dec2bin(100)) //1100100
console.log(dec2bin(12)) //1100
本博客所有文章除特别声明外,如需转载或引用,请注明出处!