栈,队列和背包总结

来源:互联网 发布:中国高速铁路 知乎 编辑:程序博客网 时间:2024/05/21 10:07

1. 栈的实现

(1)栈数据结构

public class Stack<Item> implements Iterable<Item> {    private Node<Item> first;     // top of stack    private int n;                // size of the stack    // helper linked list class    private static class Node<Item> {        private Item item;        private Node<Item> next;    }......}
(2)压栈操作
public void push(Item item) {    Node<Item> oldfirst = first;    first = new Node<Item>();    first.item = item;    first.next = oldfirst;    n++;}
(3)出栈操作
public Item pop() {    if (isEmpty()) throw new NoSuchElementException("Stack underflow");    Item item = first.item;        // save item to return    first = first.next;            // delete first node    n--;    return item;                   // return the saved item}

(4)栈迭代器

// return an iterator to this stack that iterates through the items in LIFO order.public Iterator<Item> iterator() {    return new ListIterator<Item>(first);}// an iterator, doesn't implement remove() since it's optionalprivate class ListIterator<Item> implements Iterator<Item> {    private Node<Item> current;    public ListIterator(Node<Item> first) {        current = first;    }    public boolean hasNext() {        return current != null;    }    public void remove() {        throw new UnsupportedOperationException();    }    public Item next() {        if (!hasNext()) throw new NoSuchElementException();        Item item = current.item;        current = current.next;        return item;    }}


2. 队列的实现

(1)队列数据结构

public class Queue<Item> implements Iterable<Item> {    private Node<Item> first;    // beginning of queue    private Node<Item> last;     // end of queue    private int n;               // number of elements on queue    // helper linked list class    private static class Node<Item> {        private Item item;        private Node<Item> next;    }......}
(2)入队操作
public void enqueue(Item item) {    Node<Item> oldlast = last;    last = new Node<Item>();    last.item = item;    last.next = null;    if (isEmpty()) first = last;    else oldlast.next = last;    n++;}
(3)出队操作
public Item dequeue() {    if (isEmpty()) throw new NoSuchElementException("Queue underflow");    Item item = first.item;    first = first.next;    n--;    if (isEmpty()) last = null;   // to avoid loitering    return item;}
(4)队列迭代器
public Iterator<Item> iterator() {    return new ListIterator<Item>(first);}// an iterator, doesn't implement remove() since it's optionalprivate class ListIterator<Item> implements Iterator<Item> {    private Node<Item> current;    public ListIterator(Node<Item> first) {        current = first;    }    public boolean hasNext() {        return current != null;    }    public void remove() {        throw new UnsupportedOperationException();    }    public Item next() {        if (!hasNext()) throw new NoSuchElementException();        Item item = current.item;        current = current.next;        return item;    }}


3. 背包的实现

(1)背包的数据结构

public class Bag<Item> implements Iterable<Item> {    private Node<Item> first;    // beginning of bag    private int n;               // number of elements in bag    // helper linked list class    private static class Node<Item> {        private Item item;        private Node<Item> next;    }......}
(2)入包操作
public void add(Item item) {    Node<Item> oldfirst = first;    first = new Node<Item>();    first.item = item;    first.next = oldfirst;    n++;}
(3)背包迭代器
public Iterator<Item> iterator() {    return new ListIterator<Item>(first);}// an iterator, doesn't implement remove() since it's optionalprivate class ListIterator<Item> implements Iterator<Item> {    private Node<Item> current;    public ListIterator(Node<Item> first) {        current = first;    }    public boolean hasNext() {        return current != null;    }    public void remove() {        throw new UnsupportedOperationException();    }    public Item next() {        if (!hasNext()) throw new NoSuchElementException();        Item item = current.item;        current = current.next;        return item;    }}

说明:用链表数据结构实现Bag API只需要将Stack中的push()改名为add(),并去掉pop()的实现即可。


参考文献:

[1] 算法(第4版)  

原创粉丝点击