第四章 Caché 算法与数据结构 栈原理

文章目录

  • 第四章 Caché 算法与数据结构 栈原理
    • 数据实现
    • 链表实现
  • 入栈
  • 出栈
  • 链表实现完整实例
    • 定义链表
    • 定义栈类
    • 调用
  • 复杂度
  • 应用
  • 小思考

第四章 Caché 算法与数据结构 栈原理

  • 是一种线性数据结构,元素只能先入后出,最早进入的元素存放的位置叫做栈底,最后进入的元素存放的位置叫做栈顶。

数据实现

栈底
栈顶
1
3
4
5
6
9

链表实现

栈底
栈顶
1
3
4
5
6
9

入栈

把新元素7入栈,元素7成为栈顶

栈底
栈顶
1
3
4
5
6
7
9

出栈

把元素6出栈,元素9成为栈顶

栈底
栈顶
1
3
4
5
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é 中方法调用的堆叠。

小思考

如何用数组来实现

你可能感兴趣的:(Caché,算法与数据结构)