好久没有更新博客了,今晚闲来无事就想着更新一下博客,那就写写数据结构的栈吧。简单实现
栈是一种先进后出的数据结构,你就把它想成是一只冰糖葫芦的木棍吧,一开始的时候只有一条木棍,里面没有冰糖葫芦,然后我们窜上山楂,一个,两个。。。这样,然后浇上冰糖,当当当,冰糖葫芦制作成功,一条5元,很便。。。啊呸,扯远了。
那么你看,你拿着这冰糖葫芦,准备吃,你只能从上面开始一个个吃,所以,最后叉上去的山楂是最先吃到的,这就是我们的栈了。
Talk is cheap, show me the code!
/**
* 栈实现
* @author Chinvi
* @date 2018年3月22日
*/
public class MyStack<K> {
private Node<K> top = null;
/**
* 定义一个内部类:栈节点
* 节点存储两样东西:
* 1、节点的值:范型
* 2、下一个节点的引用
*/
private static class Node<K> {
K value;
Node<K> next;
}
// 长度
private int size = 0;
/**
* 推入数据
* @param k 待推入的值
* @return 返回推入的值,如果出现问题直接返回null
*/
public K push(K k){
// 如果入参为空就返回null
if(null == k){
return null;
}
// 如果栈顶点为空,说明是一个空栈,则创建顶点
if(null == top){
top = new Node<K>();
top.value = k;
top.next = null;
// 顶点不为空,则说明不是空栈,则把值放到顶点,原先的顶点放到第二个位置,
// 同时将新顶点的下一个节点指向原先的顶点
} else {
Node<K> node = new Node<K>();
node = top;
top = new Node<K>();
top.next = node;
top.value = k;
}
// 长度+1
size++;
return k;
}
/**
* 弹出数据
* @return 弹出数据的值,如果出现问题或者空栈的话则返回null
*/
public K pop(){
// 如果顶点为空的话表示空栈,则返回null
if(null == top){
return null;
}
// 将顶点的值先存储到变量[node]里面,然后将顶点更新为第二个节点,
// 同时将长度-1,最后返回弹出的值
Node<K> node = top;
top = top.next;
size--;
return node.value;
}
/**
* 获取顶点的值
* (该方法与pop()不同,pop是将顶点弹出来,并返回弹出来的值而peek()只是返回顶点的值,并修改操作栈的结构)
* @return 顶点的值,如果出现问题或者空栈则返回null
*/
public K peek(){
// 如果没有顶点标识空栈,则返回null
if(null == top){
return null;
}
// 返回顶点的值
return top.value;
}
public int size(){
return size;
}
@Override
public String toString() {
if(null == top){
return "空栈";
}
Node<K> node = top;
StringBuffer sb = new StringBuffer();
while(null != node){
sb.append(node.value.toString());
if(null != node.next){
sb.append(",");
}
node = node.next;
}
return sb.toString();
}
}
测试:
public static void main(String[] args){
MyStack<String> stack = new MyStack<String>();
System.out.println(stack.push("1"));
System.out.println(stack.push("2"));
System.out.println(stack.push("3"));
System.out.println(stack.peek());
System.out.println(stack.pop());
System.out.println(stack.toString());
/** output
* 1
* 2
* 3
* 3
* 3
* 2,1
*/
}
于是栈就给撸出来了,这个只是简单实现,如果考虑深一点还要考虑是否支持多线程、栈容量控制等的功能
但是这不是我们现在考虑的。
-----------------------------------呵呵分隔线-----------------------------------
好了,如果写的有问题或者有什么不懂的可以留言在下方。
有问题我也不一定会改、改了也不一定会承认。