【数据结构】Java 栈实现

好久没有更新博客了,今晚闲来无事就想着更新一下博客,那就写写数据结构的栈吧。简单实现

栈是一种先进后出的数据结构,你就把它想成是一只冰糖葫芦的木棍吧,一开始的时候只有一条木棍,里面没有冰糖葫芦,然后我们窜上山楂,一个,两个。。。这样,然后浇上冰糖,当当当,冰糖葫芦制作成功,一条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
		 */
	}

于是栈就给撸出来了,这个只是简单实现,如果考虑深一点还要考虑是否支持多线程、栈容量控制等的功能

但是这不是我们现在考虑的。

-----------------------------------呵呵分隔线-----------------------------------

好了,如果写的有问题或者有什么不懂的可以留言在下方。









有问题我也不一定会改、改了也不一定会承认。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值