码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构之背包,队列,栈

时间:2014-07-16 19:17:44      阅读:381      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   java   color   使用   

1:数据抽象

概念:

       抽象数据类型,是一种能够对使用者隐藏数据表示的数据类型,抽象数据类型之所以重要,是因为他在程序设计上支持封装。

本节目标:本节将介绍三种抽象类型,用java实现,背包,堆栈,队列等最简单的数据结构。

 

    1. 背包   背包是一种不支持从中删除元素的集合数据类型。他的目的就是帮助用例手机元素并迭代遍历所有收集到的元素。API图示参考1.1

      bubuko.com,布布扣

      import java.util.Iterator;
      import java.util.NoSuchElementException;
      /**
      bag数据结构的实现 后进先出 不支持删除元素
      */
      public class Bag<Item> implements Iterable<Item> { private int N; private Node<Item> first; // helper linked list class private static class Node<Item> { private Item item; private Node<Item> next; } /** * Is this bag empty? * * @return true if this bag is empty; false otherwise */ public boolean isEmpty() { return first == null; } /** * Returns the number of items in this bag. * * @return the number of items in this bag */ public int size() { return N; } /** * Adds the item to this bag. * * @param item the item to add to this bag */ public void add(Item item) { Node<Item> oldfirst = first; first = new Node<Item>(); first.item = item; first.next = oldfirst; N++; } /** * Initializes an empty bag. */ public Bag() { N = 0; first = null; } @Override public Iterator<Item> iterator() { return new ListIterator<Item>(first); } private class ListIterator<Item> implements Iterator<Item> { private Node<Item> current; public ListIterator(Node<Item> first) { current = first; } @Override public boolean hasNext() { return current != null; } @Override public Item next() { if (!hasNext()) throw new NoSuchElementException(); Item item = current.item; current = current.next; return item; } @Override public void remove() { throw new UnsupportedOperationException(); } } }
    2. 队列 先进先出 可以联想在剧院门前排队等待入门的人

      先进先出的队列结构,FIFO。Code实现

      1. bubuko.com,布布扣
      2. package com.luochuang.demo.stdlib;
        
        import org.w3c.dom.ls.LSException;
        
        import java.util.Iterator;
        import java.util.NoSuchElementException;
        
        public class Queue<Item> implements Iterable<Item> {
        
            private int N;// number of element on queue
        
            private Node<Item> first;// beginning of queue
        
            private Node<Item> last;// end of queue
        
            public class Node<Item> {
                private Node<Item> next;
        
                private Item item;
            }
        
            public Item peek() {
                if (isEmpty()) {
                    throw new NoSuchElementException();
                }
                return first.item;
            }
        
            /**
             * add item to queue
             *
             * @param item the item to add
             */
            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++;
            }
        
            /**
             * Removes and returns the item on this queue that was least recently added.
             *
             * @return the item on this queue that was least recently added
             * @throws java.util.NoSuchElementException if this queue is empty
             */
            public Item deQueue() {
                if (isEmpty()) {
                    throw new NoSuchElementException();
                }
                Item item = first.item;
                first = first.next;
                N--;
                if (isEmpty()) {
                    last = null;
                }
                return item;
            }
        
            /**
             * is this queue empty?
             *
             * @return true if this queue is empty otherwise
             */
            public boolean isEmpty() {
                return first == null;
            }
        
            /**
             * Returns the number of items in this queue.
             *
             * @return the number of items in this queue
             */
            public int size() {
                return N;
            }
        
            /**
             * Initializes an empty queue.
             */
            public Queue() {
                first = null;
                last = null;
                N = 0;
            }
        
            @Override
            public Iterator<Item> iterator() {
                return null;
            }
        
            public class ListIterator implements Iterator<Item> {
        
                private Node<Item> current;
        
                public ListIterator(Node<Item> first) {
                    first = current;
                }
        
                @Override
                public boolean hasNext() {
                    return current == null;
                }
        
                @Override
                public Item next() {
                    if (!hasNext())
                        throw new NoSuchElementException();
                    Item item = current.item;
                    current = current.next;
                    return item;
                }
        
                @Override
                public void remove() {
                    throw new UnsupportedOperationException();
                }
            }
        }
    3. 下压栈   
      bubuko.com,布布扣
      下压栈是一种基于后进先出的队列结构,LIFO。比如点击超级链接中的按钮,当回退之后能重新访问之前的页面,即从栈中弹出。也可以联想桌面上放的一匝便签.
package com.luochuang.demo.stdlib;

import java.util.Iterator;
import java.util.NoSuchElementException;

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

    private int N;

    private Node<Item> first;

    /**
     * Initializes an empty stack
     */
    public Stack() {
        first = null;
        N = 0;
    }

    /**
     * Adds the item to this stack.
     * @param item the item to add
     */
    public void push(Item item) {
        Node<Item> oldfirst = first;
        first = new Node<Item>();
        first.item = item;
        first.next = oldfirst;
        N++;
    }


    /**
     * Removes and returns the item most recently added to this stack.
     *
     * @return the item most recently added
     * @throws java.util.NoSuchElementException if this stack is empty
     */
    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
    }

    /**
     * Returns (but does not remove) the item most recently added to this stack.
     * @return the item most recently added to this stack
     * @throws java.util.NoSuchElementException if this stack is empty
     */
    public Item peek() {
        if (isEmpty()) throw new NoSuchElementException("Stack underflow");
        return first.item;
    }

    public boolean isEmpty() {
        return first == null;
    }

    public int size() {
        return N;
    }

    private class Node<Item> {
        private Node<Item> next;

        private Item item;
    }

    /**
     * Returns a string representation of this stack.
     * @return the sequence of items in the stack in LIFO order, separated by spaces
     */
    public String toString() {
        StringBuilder s = new StringBuilder();
        for (Item item : this)
            s.append(item + " ");
        return s.toString();
    }

    @Override
    public Iterator<Item> iterator() {
        return new ListIterator(first);
    }

    public class ListIterator implements Iterator<Item> {

        public Node<Item> current;

        public ListIterator(Node<Item> first) {
            first = current;
        }

        @Override
        public boolean hasNext() {
            return current == null;
        }

        @Override
        public Item next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            Item item = current.item;
            current = current.next;
            return item;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
}

数据结构之背包,队列,栈,布布扣,bubuko.com

数据结构之背包,队列,栈

标签:style   blog   http   java   color   使用   

原文地址:http://www.cnblogs.com/luochuanghero/p/3844793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!