数据结构实现

package kunpu.arithmetic.datatype;

import java.util.Iterator;

/**
 * @author zhen
 * @Date 2018/4/11 10:12
 */
public class Bag<Item> implements Iterable<Item> {
    private Node first;
    private class Node{
        Item item;
        Node next;
    }

    public void add(Item item){
        Node oldFirst = first;
        first = new Node();
        first.item = item;
        first.next = oldFirst;
    }
    @Override
    public Iterator<Item> iterator() {
        return null;
    }

    private class ListIterator<Item> implements Iterator<Item>{
        private Bag.Node current = first;

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

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


package kunpu.arithmetic.datatype;

import java.util.Iterator;

/**
 * 下压堆栈(链表实现)
 *
 * @author zhen
 * @Date 2018/4/11 9:51
 */
public class Stack<Item> implements Iterable<Item> {

    private Node first;
    private int N;
    public int size(){
        return N;
    }
    public boolean isEmpty(){
        return first == null;
    }
    public void push(Item item){
        Node oldFirst = first;
        first.item = item;
        first.next = oldFirst;
        N++;
    }

    public Item pop(){
        Item item = first.item;
        first = first.next;
        N--;
        return item;
    }


    public Iterator<Item> iterator() {
        return new ReverseArrayIterator();
    }

    private class ReverseArrayIterator implements Iterator<Item>{

        public boolean hasNext(){
            return first.next != null;
        }
        public Item next(){
            return first.next.getItem();
        }
        public void remove(){

        }
    }



    private class Node{
        Item item;
        Node next;

        public Item getItem() {
            return item;
        }

        public void setItem(Item item) {
            this.item = item;
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }
    }

}


package kunpu.arithmetic.datatype;

import java.util.Iterator;

/**
 * 下压栈
 *
 * @author zhen
 * @Date 2018/4/11 9:22
 */
public class ResizingArraysStack<Item> implements Iterable<Item> {

    private Item[] a = (Item[]) new Object[1];
    private int N = 0;
    public boolean isEmpty(){
        return N ==0;
    }
    public int size(){
        return N;
    }

    private void resize(int max){
        Item[] temp = (Item[]) new Object[max];
        for (int i = 0; i < N; i++){
            temp[i] = a[i];
        }
        a = temp;
    }

    public void push(Item item){
        if (N == a.length){
            resize(2*a.length);
        }
        a[N++] = item;
    }

    public Item pop(){
        Item item = a[--N];
        a[N] = null;
        if (N >0 && N== a.length/4){
            resize(a.length/2);
        }
        return item;
    }
    @Override
    public Iterator<Item> iterator() {
        return new ReverseArrayIterator();
    }

    private class ReverseArrayIterator implements Iterator<Item>{
        private int i = N;
        public boolean hasNext(){
            return i>0;
        }
        public Item next(){
            return a[--i];
        }
        public void remove(){}
    }
}


package kunpu.arithmetic.datatype;

import java.util.Iterator;

/**
 * @author zhen
 * @Date 2018/4/11 10:02
 */
public class Queue<Item> implements Iterable<Item> {
    private Node first;
    private Node last;
    private int N;

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

    public int size(){
        return N;
    }

    public void enqueue(Item item){
        Node oldLast = last;
        last = new Node();
        last.item = item;
        last.next = null;
        if (isEmpty()){
            first = last;
        }else{
            oldLast.next = last;
        }
        N++;
    }

    public Item dequeue(){
        Item item = first.item;
        first = first.next;
        if (isEmpty()){
            last = null;
        }
        N--;
        return item;
    }

    @Override
    public Iterator<Item> iterator() {
        return null;
    }

    private class Node{
        Item item;
        Node next;
    }
}


package kunpu.arithmetic.datatype;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 使用无序链表实现符号表
 *
 * @author zhen
 * @Date 2018/4/11 16:30
 */
public class SequentialSearchST<Key, Value> {
    Set<Key> keySet = new HashSet<>();
    int N = 0;
    private class Node {
        Key key;
        Value value;
        Node next;
        Node(Key key, Value value, Node next){
            this.key = key;
            this.value = value;
            this.next = next;
        }
    }

    private Node first;

    public void put(Key key, Value value){
        for (Node x = first; x != null; x = x.next){
            if (key.equals(x.key)){
                x.value = value;
                return;
            }
        }
        first = new Node(key, value, first);
        N++;
        keySet.add(key);
    }

    public Value get(Key key){
        for (Node x = first; x != null; x = x.next){
            if (key.equals(x.key)){
                return x.value;
            }
        }
        return null;
    }

    public void delete(Key key){
        for (Node x = first; x != null; x = x.next){
            if (x.next == null){
                return;
            }
            if (x.next.key.equals(key)){
                x.next = x.next.next;
            }
        }
        N--;
        keySet.remove(key);
    }

    public boolean contains(Key key){
        return get(key) != null;
    }

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

    public int size(){
        return N;
    }

    public Iterable<Key> keys(){
       return new Iterable<Key>() {
           @Override
           public Iterator<Key> iterator() {
               return keySet.iterator();
           }
       };
    }


}



package kunpu.arithmetic.datatype;

/**
 * 二分查找 基于有序数组
 * @author zhen
 * @Date 2018/4/12 9:26
 */
public class BinarySearchST<Key extends Comparable<Key>, Value> {
    private Key[] keys;
    private Value[] values;
    private int N;
    public BinarySearchST(int capacity){
        keys = (Key[])new Comparable[capacity];
        values = (Value[])new Object[capacity];
    }

    public int size(){
        return N;
    }

    public boolean isEmpty(){
        return N == 0;
    }

    public Value get(Key key){
        if (isEmpty()){
            return null;
        }
        int i = rank(key);
        if (i < N && keys[i].compareTo(key) == 0){
            return values[i];
        }else{
            return  null;
        }
    }

    public void put(Key key, Value value){
        int i = rank(key);
        if ((i < N && keys[i].compareTo(key) == 0)){
            values[i] = value;
            return;
        }
        for (int j = N; j >i; j--){
            keys[j] = keys[j-1];
            values[j] = values[j-1];
            keys[i] = key;
            values[i] = value;
        }
        N++;
    }

    public void delete(Key key){
        int i = rank(key);
        if ((i < N && keys[i].compareTo(key) == 0)){
            for (int j = i; j <N-1; j++){
                keys[j] = keys[j+1];
                values[j] = values[j+1];
            }
        }
    }

    public int rank(Key key){
        int lo = 0, hi = N-1;
        while (lo <= hi){
            int mid = lo + (hi -lo)/2;
            int cmp = key.compareTo(keys[mid]);
            if (cmp < 0){
                hi = mid -1;
            }else if (cmp > 0){
                lo = mid + 1;
            }else{
                return mid;
            }
        }
        return lo;
    }

    public Key min(){
        return keys[0];
    }

    public Key max(){
        return keys[N-1];
    }

    public Key select(int k){
        return keys[k];
    }

    public Key ceiling(Key key){
        int i = rank(key);
        return keys[i];
    }

    public boolean contains(Key key){
        for (Key key1 : keys){
            if (key1.compareTo(key) == 0){
                return true;
            }
        }
        return false;
    }

    public Iterable<Key> keys(Key lo, Key hi){
        Queue<Key> q = new Queue<Key>();
        for (int i = rank(lo); i < rank(hi); i++){
            q.enqueue(keys[i]);
        }
        if (contains(hi)){
            q.enqueue(keys[rank(hi)]);
        }
        return q;
    }
}



package kunpu.arithmetic.datatype;

/**
 * 基于二叉查找树的符号表
 * @author zhen
 * @Date 2018/4/12 14:50
 */
public class BST<Key extends Comparable<Key>, Value> {
    private Node root;
    private class Node{
        private Key key;
        private Value value;
        private Node left, right;
        private int N; //以该节点为根的子树种的节点总数

        public Node(Key key, Value value, int n) {
            this.key = key;
            this.value = value;
            N = n;
        }
    }

    public int size(){
        return size(root);
    }

    private int size(Node x){
        if (x == null){
            return 0;
        }else{
            return x.N;
        }
    }

    private Value get(Key key){
        return get(root, key) ;
    }

    private Value get(Node x, Key key){
        if (x == null){
            return null;
        }
        int cmp = key.compareTo(x.key);
        if (cmp < 0){
            return get(x.left, key);
        }else if (cmp > 0){
            return get(x.right, key);
        }else{
            return x.value;
        }
    }

    public void put(Key key, Value value){
        put(root, key, value);
    }


    private Node put(Node node, Key key, Value value){
        if (node == null){
            return new Node(key, value, 1);
        }
        int cmp = node.key.compareTo(key);
        if (cmp < 0){
            node.left = put(node.left, key, value);
        }else if (cmp > 0){
            node.right = put(node.right,  key, value);
        }else {
            node.value = value;
        }
        node.N = size(node.left) + size(node.right) + 1;
        return node;
    }

    public Key min(){
        return min(root).key;
    }

    private Node min(Node x){
        if (x.left == null) {
            return x;
        }
        return min(x.left);
    }

    public Key floor(Key key){
        Node x = floor(root, key);
        if (x == null) {
            return null;
        }
        return x.key;
    }

    private Node floor(Node x, Key key){
        if (x == null){
            return null;
        }
        int cmp = x.key.compareTo(key);
        if (cmp == 0){
            return x;
        }else if (cmp < 0){
            return floor(x.left, key);
        }else{
            Node t = floor(x.right, key);
            if (t != null){
                return t;
            }else{
                return x;
            }
        }
    }

    public Key select(int k){
        return select(root, k).key;
    }

    private Node select(Node x, int k){
        if (x == null) {
            return null;
        }
        int t = size(x.left);
        if (t > k){
            return select(x.left, k);
        }else if (t < k){
            return select(x.right, k);
        }else {
            return x;
        }
    }

    public int rank(Key key){
        return rank(root, key);
    }

    private int rank(Node x, Key key){
        if(x == null){
            return 0;
        }
        int cmp = key.compareTo(x.key);
        if (cmp < 0){
            return rank(x.left, key);
        }else if(cmp > 0){
            return 1 + size(x.left) + rank(x.right, key);
        }else {
            return size(x.left);
        }
    }

    /**
     * 删除最小值
     */
    public void deleteMin(){
        root = deleteMin(root);
    }

    private Node deleteMin(Node x){
        if (x.left == null){
            return x.right;
        }
        x.left = deleteMin(x.left);
        x.N = size(x.left) + size(x.right) + 1;
        return x;
    }

    /**
     * 删除
     * @param key
     */
    public void delete(Key key){
        root = delete(root, key);
    }

    private Node delete(Node x, Key key){
        if (x == null){
            return null;
        }
        int cmp = key.compareTo(x.key);
        if (cmp < 0){
            x.left = delete(x.left, key);
        }else if(cmp > 0){
            x.right = delete(x.right, key);
        }else{
            if (x.right == null){
                return x.left;
            }
            if (x.left == null){
                return x.right;
            }
            Node t = x;
            x = min(t.right);
            x.right = deleteMin(t.right);
            x.left = t.left;
        }
        x.N = size(x.left) + size(x.right) + 1;
        return x;
    }
    public Key max(){
        return max(root).key;
    }

    private Node max(Node x){
        if (x.right == null){
            return x;
        }
        return max(x.right);
    }

    public Iterable<Key> keys(){
        return keys(min(),max());
    }

    public Iterable<Key> keys(Key lo, Key hi){
        Queue<Key> queue = new Queue<Key>();
        keys(root, queue, lo, hi);
        return queue;
    }

    private void keys(Node x, Queue<Key> queue, Key lo, Key hi){
        if (x == null){
            return ;
        }
        int cmpLo = lo.compareTo(x.key);
        int cmpHi = hi.compareTo(x.key);
        if (cmpLo < 0){
            keys(x.left, queue, lo, hi);
        }
        if (cmpLo <= 0 && cmpHi >= 0){
            queue.enqueue(x.key);
        }
        if (cmpHi > 0){
            keys(x.right, queue, lo, hi);
        }
    }
}



package kunpu.arithmetic.datatype;

/**
 * 基于堆的优先队列
 * 从大到小
 * 自上而下的完全二叉树结构,数组实现。k,k/2 = parent, 2k = left, 2k+1=right
 *
 * @author zhen
 * @Date 2018/4/10 16:30
 */
public class MaxPQ<Key  extends Comparable<Key>>{
    private Key[] pq; //基于堆的完全二叉树
    private int N = 0; //存储于pq[1..N]中,pq[0]没有使用

    public MaxPQ(int maxN){
        pq = (Key[])new Comparable[maxN + 1];
    }

    public boolean isEmpty(){
        return N ==0;
    }

    public int size(){
        return N;
    }

    public void insert(Key v){
        pq[++N] = v;
        swim(N);
    }

    public Key delMax(){
        Key max = pq[1]; //从根节点得到最大元素
        exch(1, N--); //将其和最后一个节点交换
        pq[N+1] = null; //防止越界
        sink(1); //恢复堆的有序性
        return max;
    }

    private void swim(int k){//上浮
        while(k > 1 && less(k/2, k)){
            exch(k/2, k);
            k = k/2;
        }
    }

    private void sink(int k){//下沉
        while (2*k <= N){
            int j = 2*k;
            if (j < N && less(j, j+1)){
                j++;
            }
            if (!less(k, j)){
                break;
            }
            exch(k, j);
            k = j;
        }
    }

    private void exch(int a, int b){
        Key temp = pq[a];
        pq[a] = pq[b];
        pq[b] = temp;
    }

    private boolean less(int i, int j){
        return pq[i].compareTo(pq[j]) < 0;
    }




}

 

posted @ 2018-04-16 09:10  guodaxia  阅读(229)  评论(0编辑  收藏  举报