LStack——链栈——JAVA
- 链栈是对链表的一个模型,都是线性结构 ;
文章目录
一、readme
-
实现了链栈数据结构的重要操作:入栈和出栈;
-
对于链栈:重要的是对栈顶指针(java中也就是对象(地址))的把握:
- 重点(错过):栈顶top始终指向更靠近栈底的一个结点,在出入栈的过程中,栈顶始终指向栈底(多浪漫)
-
备注:解释思路都在文档注释中;
二、写代码啦
1.先创建一下栈的基本单位——结点(就是普通的单链表节点)
/**
* 一个结点有数据域data,和指针next;
*
* 然后写个有参构造实现方法重载就好啦
*
*/
Object data;
SLNode next;
public SLNode(Object data){
this.data=data;
}
2.然后写对结点形成链栈一些操作
(0)总体框架
/**
* 链栈的操作
* 0、链栈的数据域;
* 1、入栈
* 2、出栈
* 3、遍历所有元素
* 4、测试
*/
(1)写链栈的数据域
//链栈的数据域;
/**
* 长度size;
* 栈顶指针top;只需要一个栈顶指针就够了;
*/
int size;
SLNode top=null;//栈顶
(2)入栈push
//入栈
/**
* 思路:
* 1、判断是否为空
* 2、创建一个新的结点
* 3、新结点的next指向top ,注意:是新节点指向top,不是top指向新结点;(错过)
* 4、top变为新结点位置进行,更新
* 5、size++
*/
public void pushOneLNode(Object data){
SLNode newLNode =new SLNode(data);
//栈为空
if(top==null){
top= newLNode;
size++;
return;
}
newLNode.next=top;//这一步,重点:新创建的节点指向已创建的栈结点;虽然top我远离了栈底但是我一直指向你;(错过)
top=newLNode;
size++;
}
(3)出栈pop
//出栈
/**
* 思路:
* 1、判断是否为空
* 2、删除栈顶元素,top指向下一个元素 注意:top的next指向更靠近栈底一个元素;
* 3、返回删除的元素
*/
public Object popOneLNode(){
if(top==null){
System.out.println("没有结点可以删除");
return null;
}
SLNode oldTopLNode =top;
top=top.next;//这一步,重点:top的next指向更靠近栈底一个元素;(错过)
size--;
return oldTopLNode.data;
}
(4)遍历所有元素
/**
* 思路:
* 1、判断是否为空
* 2、从栈顶开始遍历,直到栈底 ,注意:不要直接操作top,因为top是栈顶,会改变栈结构
* 3、每次遍历,都打印出来
* 4、直到遍历到栈底,结束
*
*/
public void printAll(){
if(top==null){
System.out.println("没有元素可以遍历");
return;
}
SLNode temp=top;//不要直接操作top,因为top是栈顶,会改变栈结构
while(temp!=null){
System.out.println(temp.data);
temp=temp.next;
}
}
3、测试
//测试
public static void main(String[] args) {
STLinkOp stLinkOp=new STLinkOp();
stLinkOp.pushOneLNode(1);//在栈底
stLinkOp.pushOneLNode(2);
stLinkOp.pushOneLNode(3);
stLinkOp.pushOneLNode(4);//在栈顶
stLinkOp.popOneLNode();
stLinkOp.popOneLNode();
stLinkOp.printAll();
}
附录所有代码如下:
package LStack;
public class STLinkOp {
/**
* 链栈的操作
* 0、链栈的数据域;
* 1、入栈
* 2、出栈
* 3、遍历所有元素
* 4、测试
*/
//链栈的数据域;
/**
* 长度size;
* 栈顶指针top;
*/
int size;
SLNode top=null;//栈顶
//入栈
/**
* 思路:
* 1、判断是否为空
* 2、创建一个新的结点
* 3、新结点的next指向top ,注意:是新节点指向top,不是top指向新结点;(错过)
* 4、top变为新结点位置进行,更新
* 5、size++
*/
public void pushOneLNode(Object data){
SLNode newLNode =new SLNode(data);
//栈为空
if(top==null){
top= newLNode;
size++;
return;
}
newLNode.next=top;//这一步,重点:新创建的节点指向已创建的栈结点;虽然top我远离了栈底但是我一直指向你;(错过)
top=newLNode;
size++;
}
//出栈
/**
* 思路:
* 1、判断是否为空
* 2、删除栈顶元素,top指向下一个元素 注意:top的next指向更靠近栈底一个元素;
* 3、返回删除的元素
*/
public Object popOneLNode(){
if(top==null){
System.out.println("没有结点可以删除");
return null;
}
SLNode oldTopLNode =top;
top=top.next;//这一步,重点:top的next指向更靠近栈底一个元素;(错过)
size--;
return oldTopLNode.data;
}
//遍历所有元素
/**
* 思路:
* 1、判断是否为空
* 2、从栈顶开始遍历,直到栈底 ,注意:不要直接操作top,因为top是栈顶,会改变栈结构
* 3、每次遍历,都打印出来
* 4、直到遍历到栈底,结束
*
*/
public void printAll(){
if(top==null){
System.out.println("没有元素可以遍历");
return;
}
SLNode temp=top;//不要直接操作top,因为top是栈顶,会改变栈结构
while(temp!=null){
System.out.println(temp.data);
temp=temp.next;
}
}
//测试
public static void main(String[] args) {
STLinkOp stLinkOp=new STLinkOp();
stLinkOp.pushOneLNode(1);//在栈底
stLinkOp.pushOneLNode(2);
stLinkOp.pushOneLNode(3);
stLinkOp.pushOneLNode(4);//在栈顶
stLinkOp.popOneLNode();
stLinkOp.popOneLNode();
stLinkOp.printAll();
}
}