《算法思维——一种问题驱动的思维方式》之第8篇:数据结构之动态栈篇——采用Java编程语言实现
在数据结构的学习中,动态栈是最常见的一种线性数据结构,使用范围广。
栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。
按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是允许在同一端进行插入和删除操作的特殊线性表。
允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。
插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。
在创建动态栈时,对不同节点之间的链接关系梳理清楚,这一点十分重要。。。
比如,下面开始试着用Java编程语言来实现动态栈的基本操作,包括:
- 在动态栈中插入节点(push操作)
- 在动态栈中删除节点 (pop操作)
- 返回动态栈的栈顶节点 (peek操作)
- 求动态栈的长度 (返回长度)
- 打印输出动态栈的全部元素
动态栈的节点,可以按如下方式定义:
动态栈的节点的实现源代码,可参考以下程序,
/**
*
* @作者: 文方俊
* @日期:2020年11月30日
* @功能:动态栈的节点的实现
*/
protected class Node{
public int getValue(){
return this.value;
}
Node(int value){
this.value=value;
this.next=null;
};
private int value;
private Node next;
};
- 在动态栈中插入节点(push操作)
如上图,包含值为1和值为2的两个节点进栈后,栈中多出了两个新节点。
动态栈中插入节点(push操作)的源代码,可参考如下程序,
/**
*
* @作者: 文方俊
* @日期:2020年11月30日
* @功能:动态栈中插入节点(push操作)
*/
public void push(int value){
Node newNode=new Node(value);
if(null==this.top){
this.top=newNode;
}else{
newNode.next=this.top;
this.top=newNode;
}
this.length++;
}
- 在动态栈中删除节点 (pop操作)
如上图,包含值为2的节点出栈后,栈中还剩下值为1的节点。
动态栈中删除节点操作(pop操作)的源代码,可参考如下程序,
/**
*
* @作者: 文方俊
* @日期:2020年11月30日
* @功能:动态栈中删除节点(pop操作)
*/
public Node pop(){
if(null==this.top){
return null;
}else{
Node popNode=this.top;
this.top=this.top.next;
this.length--;
return popNode;
}
}
- 返回动态栈的栈顶节点 (peek操作)
如上图,包含值为1和值为2的两个节点进栈后,栈中多出了两个新节点。
返回动态栈的栈顶节点 (peek操作)的源代码,可参考如下程序,
/**
*
* @作者: 文方俊
* @日期:2020年11月30日
* @功能:动态栈中返回栈顶节点 (peek操作)
*/
public Node peek(){
return this.top;
}
- 求动态栈的长度 (返回长度)
如上图所示的动态栈,栈的总长度为2。
求动态栈的长度 (返回长度)的源代码,参考如下,
/**
*
* @作者: 文方俊
* @日期:2020年11月30日
* @功能:动态栈中返回栈的长度
*/
public int length(){
return this.length;
}
- 打印输出动态栈的全部元素
如上图所示的动态栈,打印输出全部栈中元素依次为 2 -> 1。
打印输出动态栈的全部元素的程序实现,可参考如下源代码,
/**
*
* @作者: 文方俊
* @日期:2020年11月30日
* @功能:打印输出动态栈的全部元素
*/
public ArrayList printStack(){
ArrayList values=new ArrayList(0);
Node tmp=this.top;
while(null!=tmp){
values.add(tmp.value);
tmp=tmp.next;
}
return values;
}
完整的程序实现,可关注本人微信公众号“AI早知道”获取。。。