DS07-栈的实现方式之链表实现

栈是一种先进后出的数据结构,而链表有一个很大的特点:在链表头部增加/删除节点只需要O(1)的时间复杂度,利用这个特点可以设计出O(1)时间复杂度的链表实现栈

实现的时候还是先写一个接口类Stack,把一些操作定义在里面.然后写一个LinkedList类,实现链表的基本操作.再写一个LinkedListStack类,实现Stack接口,复用LinkedList类的实现方法并完成代码测试即可

具体代码如下:
Stack接口类:

public interface Stack<E> {
	public void push(E e);
	public E pop();
	public E peek();
	public int getSize();
	public boolean isEmpty();
}

LinkedList`链表类:

/**
 * 链表类
 * @author ChenZhuJi
 *
 * @param <E>
 */
public class LinkedList<E> {
	
	//私有的内部类,仅在这个类中能够使用,表示一个节点
	private class Node {
		public E e;	//节点中存储的数据
		public Node next;	//下一个节点
		
		public Node(E e,Node next) {
			this.e = e;
			this.next = next;
		}
		
		public Node() {
			this(null,null);
		}
		
		@Override
		public String toString() {
			return e.toString();
		}
	}
	
	private Node head;	//头节点
	private int size;		//链表的长度
	
	public LinkedList() {
		head = new Node();
		size = 0;
	}
	
	/**
	 * 获取链表的长度
	 * @return 链表长度
	 */
	public int getSize() {
		return size;
	}
	
	/**
	 * 获取链表中指定索引的元素
	 * @param index 索引值
	 * @return 元素值
	 */
	public E get(int index) {
		if(index >= size || index < 0) {
			throw new IllegalArgumentException("索引值不存在或索引越界");
		}
		Node pre = head;
		for(int i = 0; i < index;i++) {
			pre = pre.next;
		}
		return pre.e;
	}
	
	/**
	 * 获取链表的表头元素
	 * @return 表头元素
	 */
	public E getFirst() {
		return get(0);
	}
	
	/**
	 * 判断链表是否为空
	 * @return 链表是否为空
	 */
	public boolean isEmpty() {
		return size ==0;
	}
	
	/**
	 * 在链表头添加一个元素
	 * @param e 要添加的元素
	 */
	public void addFirst(E e) {
		head = new Node(e,head);
		size++;
	}
	
	/**
	 * 删除链表头元素
	 * @return 被删除的元素
	 */
	public E removeFirst() {
		Node ret = head;
		head = head.next;
		size --;
		return ret.e;
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("[ ");
		Node pre = head;
		for(int i = 0; i < size - 1; i++) {
			sb.append(pre.e + "->");
			pre = pre.next;
		}
		sb.append(pre.e +" ]");
		return sb.toString();
	}
}

LinkedListStack链栈实现类:

public class LinkedListStack<E> implements Stack<E> {
	private LinkedList<E> list;
	
	public LinkedListStack() {
		list = new LinkedList<E>(); 
	}

	@Override
	public void push(E e) {
		list.addFirst(e);
	}

	@Override
	public E pop() {
		return list.removeFirst();
	}

	@Override
	public E peek() {
		return list.getFirst();
	}

	@Override
	public int getSize() {
		return list.getSize();
	}

	@Override
	public boolean isEmpty() {
		return list.isEmpty();
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("LinkedListStack : size = "+ list.getSize()+"  ");
		sb.append(list.toString());
		return sb.toString();
	}
	
	public static void main(String[] args) {
		LinkedListStack<Integer> lls = new LinkedListStack<Integer>();
		for(int i = 0; i <8; i++) {
			lls.push(i);
			System.out.println(lls);
		}
		lls.pop();
		System.out.println(lls);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值