文章目录
一、前言
工作之余,学习一下数据结构与算法,今天学习数据结构:“栈”。
相信各位帅气的程序员对这个栈是相当的熟悉。
但是笔者就总有一个臭毛病:一看就会,一写就拉稀。
所以今天小编就自己动手亲自用单向链表实现“栈”
二、什么是栈?
- 小编的理解:
- 一串有顺序的结构
- 只能从同一个位置取出元素或者添加元素
- 不能从中间存元素或者取元素
- 百度百科
接下来,就进入到运用单链表实现有限容量的栈,实操开始。
三、链表节点
- 既然是用链表来实现栈,那么首先就必须有一个链表节点,出于简单考虑,只用两个成员变量,即
- 1.整形数值
- 2.指向下一个节点的指针
/**
* 链表栈的节点
*/
class LinkedStackNode{
//用于表示数值
private int number;
//用于指向下一个节点的指针
private LinkedStackNode next;
public LinkedStackNode(int number) {
this.number = number;
}
//此处省略getter方法和setter方法
}
四、栈结构的定义
- maxSize:因为定义栈的容量,所以我们需要定义一个栈的最大容量:maxSize
- first:因为是用单链表实现,所以我们需要在栈结构中定义一个链表元素的指针,用来指向单链表的第一个元素,这里的并不是栈顶
- top:因为定义的栈是有容量要求的,所以,还需要一个变量,来记录栈中元素的数量。
class LinkedStack{
//定义栈的大小
private int maxSize;
//链表模拟栈,
private LinkedStackNode first;
//top表示栈顶,初始化是-1
private int top;
/**
* 构造方法
* @param maxSize 栈的大小
*/
public LinkedStack(int maxSize) {
this.maxSize = maxSize;
top = -1;
}
}
- 另外还有一个构造方法,来给初始变量赋值。
五、栈空判断
/**
* 判断栈是否为null
* @return 结果
*/
public boolean isEmpty(){
return top == -1;
}
六、栈满判断
/**
* 判断栈是否满了
* @return
*/
public boolean isFull(){
return top+1 == maxSize;
}
七、入栈push(int value) 实现
1.入栈逻辑
- 1.首先判断栈是否满了,如果满了则不能添加,给出提示,直接返回
- 2.新创建一个节点,用于添加到链表上
- 3.将top++,表示链表中的元素新增了一个
- 4.判断头元素是否为null,如果是null,代表是第一个元素,则直接让新元素当第一个元素
- 5.如果头元素不是null,则证明,此时链表中已经有元素,则将新元素添加上即可
- 5.1.获取到链表的尾部
- 5.2.将链表添加上去
2.入栈代码实现
/**
* 入栈
* @param value 入栈的元素
*/
public void push(int value){
//1、判断栈是否满了
if(this.isFull()){
System.out.println("栈已经满了,不能再添加元素");
return;
}
//2、新创建一个节点,用于添加到链表上
LinkedStackNode node = new LinkedStackNode(value);
//3、将top++,表示链表中的元素新增了一个
top++;
//4、判断头元素是否为null,如果是null,代表是第一个元素,则直接让新元素当第一个元素
if(first == null){
first = node;
return;
}
//5.如果头元素不是null,则证明,此时链表中已经有元素,则将新元素添加上即可
//5.1获取到链表的尾部
LinkedStackNode middleNode = first;
while (middleNode.getNext() != null){
middleNode = middleNode.getNext();
}
//5.2将新元素添加上去
middleNode.setNext(node);
}
八、出栈pop()实现
1.入栈逻辑
- 1.首先判断栈是否为空栈,如果为空栈,直接返回
- 2.将链表的数量减一
- 3.如果链表中是否只有一个元素
- 3.1此时将first指向的元素存放到一个变量中
- 3.2.将first元素变成null
- 3.3.返回旧的first元素,即3.1预存起来的元素
- 4.如果链表中有大于一个元素
- 4.1.定义