栈
一、概念
数组和栈
- 数组是一种线性结构,可以在 任意位置 插入和删除数据
- 栈和队列 是 ==受限制的线性结构==
栈结构
- 是一种受限的线性表,==先进后出== LIFO(last in first out), 后进先出。
- 仅允许在表的一端进行插入和删除,这一端成为==栈顶==。相对地,另一端为栈底。
- 向一个栈插入新元素又称 ==进栈==、入栈或压栈)、出栈(退栈)
- 向一个栈删除元素又称作 ==出栈==、退栈
程序中的栈实现
- 函数调用栈
- A调用B,B中又调用了C,C中又调用D;
- 执行过程中,先将A压入栈,A没有执行完,不会退出栈
- 依次将B/C/D压入到栈中,D压入到栈顶。当前栈顺序是 栈底A->B->C->D栈顶
- D执行完,弹出栈。C/B/A 依次出栈
- 函数调用栈的称呼,就来自于其内部的实现机制(通过栈来实现的)。
- 递归(容易引发栈溢出)
栈结构的实现
- 基于数组实现
- 基于链表实现(链表:也是一种数据结构,JavaScript中没有自带的链表结构)
二、属性和方法
栈的方法(6个):
- push(element): 添加一个新元素到栈顶位置
- pop(): 移出栈顶位置,同时返回被移出的元素
- peek(): 返回栈顶的元素,不对栈做任何修改
- isEmpty(): 如果栈里没有任何元素就返回true,否则返回false
- size(): 返回栈元素的个数
- toString(): 将栈结构的内容以字符形式返回
具体代码实现
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
| 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.size = function () { return this.items.length; }
Stack.prototype.toString = function () { return this.items.toString(); } }
|
1 2 3 4 5 6 7 8
| const stack = new Stack(); stack.push(1) stack.push(2) stack.push(3) stack.items = [1,2,3] console.log(stack.items) console.log(stack.peek())
|
三、算法实例
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
|
function dec2bin(decNumber) { let stack = new Stack();
while(decNumber > 0) { stack.push(decNumber % 2);
decNumber = Math.floor(decNumber / 2);
}
let binaryString = ''; while(!stack.isEmpty()) { binaryString += stack.pop(); }
return binaryString; }
|
-
Post title: 栈
-
Post author: Chao
-
Create time: 2019-09-21 14:45:00
-
Post link: 2019/09/21/栈/
-
Copyright notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.
$tools-item-width = 2.2rem
$tools-item-font-size = 1.1rem
$tools-item-border-radius = 0.1rem
.side-tools-container {
position relative
.tools-item {
width $tools-item-width
height $tools-item-width
margin-bottom 0.2rem
color var(--text-color-3)
font-size $tools-item-font-size
background var(--background-color-1)
border-right none
border-radius $tools-item-border-radius
box-shadow 0.1rem 0.1rem 0.2rem var(--shadow-color)
cursor pointer
i {
color var(--text-color-3)
}
&:hover {
color var(--background-color-1)
background var(--primary-color)
box-shadow 0.2rem 0.2rem 0.4rem var(--shadow-color)
i {
color var(--background-color-1)
}
}
+keep-tablet() {
width $tools-item-width * 0.9
height $tools-item-width * 0.9
margin-bottom 0.2rem
font-size $tools-item-font-size * 0.9
}
&.rss {
a {
width 100%
height 100%
border-radius $tools-item-border-radius
&:hover {
color var(--background-color-1)
background var(--primary-color)
box-shadow 0.2rem 0.2rem 0.4rem var(--shadow-color)
}
}
}
}
.side-tools-list {
transform translateX(100%)
opacity 0
transition-t("transform, opacity", "0, 0", "0.2, 0.2", "linear, linear")
&.show {
transform translateX(0)
opacity 1
}
}
.exposed-tools-list {
if (hexo-config('style.scroll.percent') == true) {
.tool-scroll-to-top {
display none
&.show {
display flex
}
&:hover {
.percent {
display none
}
.arrow-up {
display flex
}
}
.arrow-up {
display none
}
.percent {
display flex
font-size 1rem
}
}
}
}
}
$icon-size = 1.2rem
$search-header-height = 3rem
.search-pop-overlay {
position fixed
top 0
left 0
z-index $z-index-8
display flex
width 100%
height 100%
background rgba(0, 0, 0, 0)
visibility hidden
transition-t("visibility, background", "0, 0", "0.3, 0.3", "ease, ease")
&.active {
background rgba(0, 0, 0, 0.35)
visibility visible
.search-popup {
transform scale(1)
}
}
.search-popup {
z-index $z-index-6
width 70%
height 80%
margin auto
background var(--background-color-1)
border-radius 0.4rem
transform scale(0)
transition-t("transform", "0", "0.3", "ease")
+keep-tablet() {
width 80%
}
+keep-mobile() {
width 90%
}
.search-header {
display flex
align-items center
height $search-header-height
padding 0 1rem
background var(--text-color-6)
border-top-left-radius 0.2rem
border-top-right-radius 0.2rem
.search-input-field-pre {
margin-right 0.2rem
color var(--text-color-3)
font-size 1.3rem
cursor pointer
}
.search-input-container {
flex-grow 1
padding 0.2rem
.search-input {
width 100%
color var(--text-color-3)
font-size 1.2rem
background transparent
border 0
outline 0
&::-webkit-search-cancel-button {
display none
}
&::-webkit-input-placeholder {
color var(--text-color-4)
font-size 1rem
}
}
}
.close-popup-btn {
color var(--text-color-3)
font-size $icon-size
cursor pointer
&:hover {
color var(--text-color-1)
}
}
}
#search-result {
position relative
display flex
box-sizing border-box
height 'calc(100% - %s)' % $search-header-height
padding 0.3rem 1.5rem
overflow auto
.search-result-list {
width 100%
height 100%
font-size 1rem
li {
box-sizing border-box
margin 0.8rem 0
padding 0.8rem 0
border-bottom 0.1rem dashed var(--border-color)
&:last-child {
border-bottom none
}
.search-result-title {
position relative
display flex
align-items center
margin-bottom 0.8rem
padding-left 1rem
font-weight bold
&::after {
position absolute
top 50%
left 0
width 0.4rem
height 0.4rem
background var(--text-color-3)
border-radius 50%
transform translateY(-50%)
content ''
}
}
.search-result {
margin 0
padding-left 1rem
line-height 2rem
word-wrap break-word
}
a {
&:hover {
color var(--text-color-3)
}
}
.search-keyword {
color var(--primary-color)
font-weight bold
border-bottom 0.1rem dashed var(--primary-color)
}
}
}
#no-result {
margin auto
color var(--text-color-4)
}
}
}
}