第四章 Caché 算法与数据结构 栈原理
栈
- 是一种线性数据结构,元素只能先入后出,最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫做栈顶。
数据实现
graph LR
3 --栈底--- 5
5 --- 1
1 --- 4
4 --- 9
9 --栈顶--- 6
链表实现
graph LR
3 --栈底-->5
5 --> 1
1 --> 4
4 --> 9
9 --栈顶--> 6
入栈
把新元素7入栈,元素7成为栈顶
graph LR
3 --栈底-->5
5 --> 1
1 --> 4
4 --> 9
9 --> 6
6 --栈顶--> 7
出栈
把元素6出栈,元素9成为栈顶
graph LR
3 --栈底-->5
5 --> 1
1 --> 4
4 --栈顶--> 9
链表实现完整实例
定义链表
Class PHA.YX.Arithmetic.Stack.Node Extends %RegisteredObject
{
Property t;
Property next As Node;
}
定义栈类
Class PHA.YX.Arithmetic.Stack Extends %RegisteredObject
{
/* 定义链表 */
Property head As PHA.YX.Arithmetic.Stack.Node;
/* 入栈 */
Method push(t)
{
i t="" d
.throw ##class(PHA.COM.MOB.Exception).%New("参数不能为空!")
i ..head = "" d
.s ..head = ##class(PHA.YX.Arithmetic.Stack.Node).%New()
.s ..head.t = t
.s ..head.next = ""
e d
.s temp = ..head
.s ..head = ##class(PHA.YX.Arithmetic.Stack.Node).%New()
.s ..head.t = t
.s ..head.next = temp
}
/* 出栈 */
Method pop()
{
s t = ..head.t
s ..head = ..head.next
q t
}
/* 栈顶元素 */
Method peek()
{
s t = ..head.t
q t
}
/* 栈空 */
Method isEmpty() As %Boolean
{
i ..head = "" q ?$YES
e q ?$NO
}
}
调用
/// w ##class(PHA.YX.Arithmetic).Stack()
ClassMethod Stack()
{
#dim stack as PHA.YX.Arithmetic.Stack = ##class(PHA.YX.Arithmetic.Stack).%New()
d stack.push("Java")
d stack.push("Kotlin")
d stack.push("Caché")
w stack.pop(),!
w stack.pop(),!
d stack.push("Andorid")
w stack.pop(),!
w stack.pop(),!
q ""
}
DHC-APP>w ##class(PHA.YX.Arithmetic).Stack()
Caché
Kotlin
Andorid
Java
复杂度
入栈和出栈只会影响到最后一个元素,不涉及其他元素的整体移动,所以无论是以数组还是以链表实现,入栈,出栈的时间复杂度都是O(1)
应用
- 栈的输出顺序和输入顺序相反,所以通常用于对历史的回溯
- 例如面包屑导航,使用户在浏览页面时可以轻松地回溯上一级或更上一级页面。
- 安卓中actvity的堆叠。
- Caché 中方法调用的堆叠。
小思考
如何用数组来实现