您的位置:首页 > 产品设计 > UI/UE

栈,队列和背包总结

2017-10-15 11:18 190 查看
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 optional
private 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 optional
private 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 optional
private 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版)  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stack queue bag push pop