算法系列(一)背包、队列和栈(Java实现)

前言:算法第四版1.3节 背包、队列和栈 学习总结

Stack:

import java.util.Iterator;

/**
 * 动态调整数组大小的栈
 * 功能: LIFO
 * @author Chuanjie
 * @param <T>
 *
 */
public class ResizingArrayStack<T> implements Iterable<T> {

	private T[] a = (T[])new Object[1];;
	private int n = 0;
	private void resize(int sz){
		T[] temp = (T[])new Object[sz];
		for(int i = 0;i < n;i++)
			temp[i] = a[i];
		a = temp;
	}
	public boolean isEmpty(){
		return n == 0;
	}
	public int size(){
		return n;
	}
	public void push(T item){
		if(n == a.length)
			resize(2*a.length);
		a[n++] = item;
	}
	public T pop(){		
		T item = a[--n];
		a[n] = null;//释放引用, 避免对象游离,垃圾回收器可以将其回收
		if(n > 0 && n == a.length/4)
			resize(a.length/2);
		return item;
	}
	@Override
	public Iterator<T> iterator() {
		return new ReverseArrayIterator();
	}
	private class ReverseArrayIterator implements Iterator<T>{
		private int i = n;
		@Override
		public boolean hasNext(){
			return i > 0;
		}
		@Override
		public T next() {			
			return a[--i];
		}
		@Override
		public void remove() {
		}
	}
}

import java.util.Iterator;

/**
 * 链表实现栈
 * 功能:LIFO
 * @author Chuanjie
 *
 */

public class Stack <T> implements Iterable<T>{

	private Node first;
	private int n;
	private class Node{
		T item;
		Node next;
	}
	
	public boolean isEmpty(){
		return first == null;
	}
	 public int size(){
		 return n;
	 }
	 
	 public void push(T item){
		 Node oldfirst = first;
		 first = new Node();
		 first.item = item;
		 first.next = oldfirst;
		 n++;
	 }
	 
	 public T pop(){
		 T item = first.item;
		 first = first.next;
		 n--;
		 return item;
	 }
	@Override
	public Iterator<T> iterator() {
		
		return new ListIterator();
	}
	private class  ListIterator implements Iterator<T>{

		private Node current = first;
		@Override
		public boolean hasNext() {
			
			return current != null;
		}

		@Override
		public T next() {
			T item = current.item;
			current = current.next;
			return item;
		}

		@Override
		public void remove() {
		}
		
	}
	 
}

Queue:

import java.util.Iterator;

/**
 * 链表实现队列
 * 功能:FIFO
 * @author Chuanjie
 *
 */
public class Queue<T> implements Iterable<T> {

	private Node first;
	private Node last;
	private int n;
	private class Node{
		T item;
		Node next;
	}
	
	public boolean isEmpty(){
		return first == null;
	}
	
	public int size(){
		return n;
	}
	
	public void enqueue(T item){ //向表尾添加元素
		Node oldlast = last;
		last = new Node();
		last.item = item;
		last.next = null;
		if(isEmpty())
			first = last; //找到last
		else 
			oldlast.next = last;
		n++;
	}
	
	public T dequeue(){  //从表头删除元素
		T item = first.item;
		first = first.next;
		if(isEmpty()) 
			last = null;
		n--;
		return item;
	}
	@Override
	public Iterator<T> iterator() {
		
		return null;
	}
}
Bag:

import java.util.Iterator;
/**
 * 链表实现背包
 * 功能:保存添加的元素
 * @author Chuanjie
 *
 * @param <T>
 */

public class Bag <T> implements Iterable<T>{

	private Node first;
	private int n;
	private class Node{
		T item;
		Node next;
	}
	
	public boolean isEmpty(){
		return first == null;
	}
	 public int size(){
		 return n;
	 }
	 
	 public void add(T item){
		 Node oldfirst = first;
		 first = new Node();
		 first.item = item;
		 first.next = oldfirst;
		 n++;
	 }
	 
	@Override
	public Iterator<T> iterator() {
		
		return new ListIterator();
	}
	private class  ListIterator implements Iterator<T>{

		private Node current = first;
		@Override
		public boolean hasNext() {
			
			return current != null;
		}

		@Override
		public T next() {
			T item = current.item;
			current = current.next;
			return item;
		}

		@Override
		public void remove() {
		}
		
	}
	 
}

总结:1. 结构化存储中,链表(链式存储)是数组(顺序存储)的重要替代方式:可以处理任意类型的数据、所需空间总是和集合大小成正比、一次操作的时间和集合大小无关。

2. 学习底层实现,尝试写API是深入理解的必经之路,Don't use a library until you understand its API!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值