1.基本概念
栈 (Stack)是一种后进先出(last in first off,LIFO)的数据结构,而队列(Queue)则是一种先进先出 (fisrt in first out,FIFO)的结构,如下图:
2.链表实现的栈
/** * @Title: LinkedStack.java * @Package io.shaoshuai.datastructure * @Description: TODO * @author 帅 * @date 2015年5月15日 下午6:27:32 * @version V1.0 */ package io.shaoshuai.datastructure; import java.util.Iterator; /** * @ClassName: LinkedStack * @Description: TODO * @author 帅 * @date 2015年5月15日 下午6:27:32 * */ public class LinkedStack<E> implements Iterable<E>{ /** * 往栈中添加一个新的元素 * @param item */ public void push(E item){ Node<E> oldFirst = first; first = new Node<E>(item); first.next = oldFirst; size ++; } /** * 移除并返回最近添加的元素 * @return */ public E pop(){ E item = first.item; first = first.next; size --; return item; } /** * 栈是否为空 * @return */ public boolean isEmpty(){ return size == 0; } /** * 栈中元素的个数 * @return */ public int size(){ return size; } private Node<E> first; private int size; /** * 单向链表数据结构 * @ClassName: Node * @Description: TODO * @author 帅 * @date 2015年5月18日 上午12:19:53 * * @param <E> */ private static class Node<E> { public E item; public Node<E> next; public Node(E item) { this.item = item; } } /** * 栈的迭代器 */ @Override public Iterator<E> iterator() { return new Iterator<E>(){ private Node<E> current = first; @Override public boolean hasNext() { return current != null; } @Override public E next() { E item = current.item; current = current.next; return item; } @Override public void remove() { first = first.next; size --; } }; } public static void main(String[] args) { LinkedStack<String> linkedStack = new LinkedStack<String>(); linkedStack.push(new String("1")); linkedStack.push(new String("2")); linkedStack.push(new String("3")); linkedStack.push(new String("4")); linkedStack.push(new String("5")); linkedStack.push(new String("6")); System.out.println(linkedStack.size()); System.out.println(linkedStack.isEmpty()); System.out.println(linkedStack.pop()); System.out.println(linkedStack.size()); } }
/** * @Title: ArrayStack.java * @Package io.shaoshuai.datastructure * @Description: TODO * @author 帅 * @date 2015年5月15日 下午7:21:39 * @version V1.0 */ package io.shaoshuai.datastructure; /** * @ClassName: ArrayStack * @Description: TODO * @author 帅 * @date 2015年5月15日 下午7:21:39 * */ public class ArrayStack<E> { private static final int DEFAULT_CAPACITY = 1<<4; private E[] elements; private int size; @SuppressWarnings("unchecked") public ArrayStack() { elements = (E[]) new Object[DEFAULT_CAPACITY]; } @SuppressWarnings("unchecked") public ArrayStack(int capacity) { elements = (E[]) new Object[capacity]; } /** * 往栈中添加一个新的元素 * @param item */ public void push(E item){ if(size == elements.length) { resize(elements.length * 2); } elements[size++] = item; } /** * 移除并返回最近添加的元素 * @return */ public E pop(){ E element = elements[--size]; //elements[size] = default(E); if(size > 0 && size == elements.length/4) { resize(elements.length/2); } return element; } /** * 栈是否为空 * @return */ public boolean isEmpty(){ return size == 0; } /** * 栈中元素的个数 * @return */ public int size(){ return size; } @SuppressWarnings("unchecked") private void resize(int capacity){ E[] tmp = (E[]) new Object[capacity]; for (int i = 0; i < capacity; i++) { tmp[i]=elements[i]; } elements = tmp; } public static void main(String[] args) { ArrayStack<String> stack = new ArrayStack<String>(); stack.push(new String("1")); stack.push(new String("2")); stack.push(new String("3")); stack.push(new String("4")); stack.push(new String("5")); stack.push(new String("6")); System.out.println(stack.size()); System.out.println(stack.isEmpty()); System.out.println(stack.pop()); System.out.println(stack.size()); } }
/** * @Title: LinkedQueue.java * @Package io.shaoshuai.datastructure * @Description: TODO * @author 帅 * @date 2015年5月15日 下午3:08:43 * @version V1.0 */ package io.shaoshuai.datastructure; import java.util.Iterator; /** * @ClassName: LinkedQueue * @Description: TODO * @author 帅 * @date 2015年5月15日 下午3:08:43 * */ public class LinkedQueue<E> implements Iterable<E>{ private Node<E> first; private Node<E> last; private int size; public LinkedQueue(){ } /** * 往队列中添加一个新的元素 * @param item */ public void enLinkedQueue(E item){ Node<E> oldLast = last; last = new Node<E>(item); if(isEmpty()) { first = last; }else { oldLast.next = last; } size++; } /** * 移除队列中最早添加的元素 * @return */ public E deLinkedQueue(){ E item = first.item; first = first.next; size --; if(isEmpty()) { last = null; } return item; } /** * 队列是否为空 * @return */ public boolean isEmpty(){ return size == 0; } /** * 队列中元素的个数 * @return */ public int size(){ return size; } @Override public Iterator<E> iterator() { return null; } private static class Node<E> { private E item; private Node<E> next; public Node(E item) { this.item = item; } } public static void main(String[] args) { LinkedQueue<String> linkedQueue = new LinkedQueue<String>(); linkedQueue.enLinkedQueue("1"); linkedQueue.enLinkedQueue("2"); linkedQueue.enLinkedQueue("3"); linkedQueue.enLinkedQueue("4"); linkedQueue.enLinkedQueue("5"); System.out.println("size:" + linkedQueue.size()); System.out.println(linkedQueue.deLinkedQueue()); System.out.println(linkedQueue.deLinkedQueue()); System.out.println("size:" + linkedQueue.size()); } }
/** * @Title: ArrayQueue.java * @Package io.shaoshuai.datastructure * @Description: TODO * @author 帅 * @date 2015年5月15日 下午10:51:59 * @version V1.0 */ package io.shaoshuai.datastructure; import java.util.Iterator; /** * @ClassName: ArrayQueue * @Description: TODO * @author 帅 * @date 2015年5月15日 下午10:51:59 * */ public class ArrayQueue<E> implements Iterable<E>{ private static final int DEFAULT_CAPACITY = 1<<4; private E[] elements; private int head; private int tail; private int size; @SuppressWarnings("unchecked") public ArrayQueue() { elements = (E[]) new Object[DEFAULT_CAPACITY]; } @SuppressWarnings("unchecked") public ArrayQueue(int capacity) { elements = (E[]) new Object[capacity]; } /** * 往队列中添加一个新的元素 * @param item */ public void enqueue(E element){ if((head - tail + 1) == elements.length) { resize(elements.length * 2); } elements[tail] = element; tail = (++tail == elements.length ? 0 : tail); size ++; } /** * 移除队列中最早添加的元素 * @return */ public E dequeue(){ E element = elements[head]; if(head > 0 && (tail - head + 1) == elements.length/4){ resize(elements.length/2); } head = (++head == elements.length ? 0 : head); size--; return element; } /** * 队列是否为空 * @return */ public boolean isEmpty(){ return size == 0; } /** * 队列中元素的个数 * @return */ public int size(){ return size; } @SuppressWarnings("unchecked") public void resize(int capacity){ E[] tmp = (E[]) new Object[capacity]; for(int i=0;i<capacity;i++) { tmp[i] = elements[i]; } elements = tmp; } @Override public Iterator<E> iterator() { return null; } public static void main(String[] args) { ArrayQueue<String> queue = new ArrayQueue<String>(); queue.enqueue("1"); queue.enqueue("2"); queue.enqueue("3"); queue.enqueue("4"); queue.enqueue("5"); System.out.println("size:" + queue.size()); System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); System.out.println(queue.dequeue()); System.out.println("size:" + queue.size()); } }