Java 實現棧、隊列、揹包

1、棧是一種後進先出策略的集合類型

/**
 * 通用節點
 */
public class Node<T> {

    private T item;

    private Node<T> next;

    public Node(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }

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

    public Node<T> getNext() {
        return next;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }
}
public class Stack<T> {

    private Node<T> first;

    private int size;

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

    public int getSize() {
        return size;
    }

    public void push(T item) {
        // 向棧頂添加元素
        Node<T> oldFirst = first;
        first = new Node<>(item);
        first.setNext(oldFirst);
        size++;
    }

    public T pop() {
        // 從棧頂刪除元素
        Node<T> oldFirst = first;
        first = oldFirst.getNext();
        size--;
        return oldFirst.getItem();
    }


    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        stack.push("node1");
        stack.push("node2");
        stack.push("node3");
        System.out.println(" size: " + stack.size);
        System.out.println(stack.pop() + " size: " + stack.getSize() + " : " + stack.isEmpty());
        System.out.println(stack.pop() + " size: " + stack.getSize() + " : " + stack.isEmpty());
        System.out.println(stack.pop() + " size: " + stack.getSize() + " : " + stack.isEmpty());

    }

}

2、隊列是一種基於先進先出策略的集合

public class Queue<T> {

    private Node<T> first;

    private Node<T> last;

    private int size;

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

    public int getSize() {
        return size;
    }

    public void enqueue(T item) {
        if (this.size == 0) {
            last = new Node<>(item);
            first = last;
        } else {
            Node<T> oldLast = last;
            last = new Node<>(item);
            oldLast.setNext(last);
        }
        size++;
    }

    public T dequeue() {
        Node<T> oldFirst = first;
        first = first.getNext();
        size--;
        return oldFirst.getItem();
    }

    public static void main(String[] args) {
        Queue<String> queue = new Queue<>();
        queue.enqueue("node1");
        queue.enqueue("node2");
        queue.enqueue("node3");
        System.out.println(" size: " + queue.size);
        System.out.println(queue.dequeue() + " size: " + queue.getSize() + " : " + queue.isEmpty());
        System.out.println(queue.dequeue() + " size: " + queue.getSize() + " : " + queue.isEmpty());
        System.out.println(queue.dequeue() + " size: " + queue.getSize() + " : " + queue.isEmpty());

    }
}

 

3.揹包是一種不支持從中刪除元素的結合數據類型,目的就是幫助用例收集元素並迭代遍歷所有收集到的元素。

public class Bag<T> implements Iterable<T> {

    private Node<T> first;

    private void add(T item) {
        Node<T> oldFirst = first;
        first = new Node<>(item);
        first.setNext(oldFirst);
    }


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

    private class ListIterator implements Iterator {
        private Node<T> current = first;

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

        @Override
        public Object next() {
            T item = current.getItem();
            current = current.getNext();
            return item;
        }

        @Override
        public void remove() {

        }
    }

    public static void main(String[] args) {
        Bag<String> bag = new Bag<>();
        bag.add("node1");
        bag.add("node2");
        bag.add("node3");
        Iterator<String> iterator = bag.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章