栈(Stack) --- 栈的链式结构

除了我之前一篇文章中介绍的栈的顺序存储,就是底层使用一个数组存储数据元素。其实也是可以使用单链表存储栈中的数据, 然后使用一个top引用来记录栈顶元素
进栈:top指向新添加的元素, 新元素的引用指向原来的栈顶元素   size + 1。
出栈:  top指向原栈顶元素的下一位元素, 使用原来的栈顶元素      size - 1。

图示其过程(制作粗糙,请见谅):
                      

参考代码:
public class LinkStack<T> {

	//定义一个节点类
	private class Node{
		//保存数据
		private T data;
		//下一个节点域
		private Node next;
		public Node(){

		}
		public Node(T data, Node next){
			this.data = data;
			this.next = next;
		}
	}
	//保存栈顶元素
	private Node top;
	//栈中的元素个数(节点数)
	private int size;

	//创建空链表
	public LinkStack(){
		top = null;
	}

	//根据指定元素创建新的栈
	public LinkStack(T element){
		top = new Node(element, null);//创建每一个元素是以节点的形式出现的
		size ++;
	}

	//返回栈的长度
	public int length(){
		return size;
	}

	//进栈
	public void push(T element){
		top = new Node(element, top);
		size ++;
	}

	//出栈
	public T pop(){
		Node oldTop = top;
		top = top.next;
		//释放原栈顶元素的引用
		oldTop.next = null;
		size --;
		return oldTop.data;
	}

	//返回栈顶元素
	public T peek(){
		return top.data;
	}

	//判断是否为空
	public boolean empty(){
		return size == 0;
	}

	//清空顺序栈
	public void clear(){
		top = null;
		size = 0;
	}

	public String toString(){
		if(size == 0){
			return "[]";
		}
		else{
			StringBuffer sb = new StringBuffer();
			sb.append("[");
			for(Node current = top; current != null; current = current.next){    //LIFO
				sb.append(current.data.toString() + ", ");
			}
			int len = sb.length();
			return sb.delete(len - 2, len).append("]").toString();
		}
	}
}

测试部分:
public static void main(String[] args) {

		LinkStack<Integer> ls = new LinkStack<Integer>();
		ls.push(11);
		ls.push(22);
		ls.push(33);
		ls.push(44);
		System.out.println("栈为:" + ls);
		System.out.println("栈顶元素是:" + ls.peek());
		ls.pop();
		System.out.println("删除栈顶后的栈为:" + ls);
		System.out.println("新的栈弹出的元素是:" + ls.pop());
	}


参考:《疯狂java 突破程序员基本功的16课》


以上是这篇的内容,如果有错误的地方或需要改进的地方,请您指出。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值