数据结构----------堆栈

数据结构---------堆栈

   1. 堆栈图解

    堆栈是一种相同数据类型的集合,所有的操作都在栈顶进行,具有后进先出(Last In First Out,LIFO)的特点,堆栈在计算机中的应用相当广泛,其基本示意图如下:

   2. 堆栈实现

  本文通过两种方式实现堆栈数据结构:(1)基于动态数组的堆栈实现;(2)基于链表的堆栈实现

  • 基于动态数组的堆栈实现

 

import java.util.Iterator;

/**
 * 基于可扩容数组的堆栈实现
 * @author Administrator
 *
 */
public class ResizingArrayStack<Item> implements Iterable<Item> {
    private static final int CAPACITY = 10;//默认初始化容量
    private Item[] items;//用数组存储数据
    private int top = -1;//栈顶指针
    public ResizingArrayStack (int capacity) {
        items = (Item[]) new Object[capacity];
    }
    public ResizingArrayStack() {
        this(CAPACITY);
    }
    
    /**
     * 调整数组的大小
     * @param max
     */
    private void resize(int max) {
        Item[] copy = (Item[]) new Object[max];
        for(int i = 0; i < max; i++) {
            copy[i] = items[i];
        }
        items = copy;
    }
    
    /**
     * 判断堆栈是否为空
     * @return
     */
    public boolean isEmpty() {
        return top == -1;
    }
    
    /**
     * 压栈
     * @param item
     */
    public void push(Item item) {
        //如果数组元素的下一个索引长度等于该数组的长度,对数组进行扩容
        if(++top == items.length) {
            resize(2 * items.length);
        }
        items[top] = item;
    }
    
    /**
     * 弹栈
     * @return
     */
    public Item pop() {
        Item item = null;
        if(isEmpty()) {
            throw new RuntimeException("堆栈数据为空");
        }
        item = items[top];
        items[top--] = null;//将当前top设为null,for GC
        //如果数组只被占满1/4,则缩减数组至原来1/2
        if(top > 0 && top == items.length/4) {
            resize(items.length/2);
        }
        return item;
    }
    
    /**
     * 返回栈顶元素
     * @return
     */
    public Item peek() {
        if(isEmpty()) {
            throw new RuntimeException("堆栈数据为空");
        }
        return items[top];
    }
    
    @Override
    public Iterator<Item> iterator() {
        // TODO Auto-generated method stub
        return new ReverseArrayIterator();
    }
    
    /**
     * 按出栈顺序遍历栈
     * @author Administrator
     *
     */
    private class ReverseArrayIterator implements Iterator<Item> {
        private int index = top;
        @Override
        public boolean hasNext() {
            return index >= 0;
        }

        @Override
        public Item next() {
            return items[index--];
        }
        
    }
}

 

 

 

  • 基于链表的堆栈实现

 

import java.util.Iterator;

/**
 * 基于链表的堆栈实现
 * @author Administrator
 *
 * @param <Item>
 */
public class LinkedStack<Item> implements Iterable<Item>{
    private Node<Item> top;//栈顶元素
    private int size = 0;//堆栈的大小 
    private class Node<Item> {
        private Item item;
        private Node<Item> next;
        public Node(Item item) {
            this.item = item;
        }
    }
    
    /**
     * 
     * 压栈
     * @param item
     */
    public void push(Item item) {
        Node<Item> newNode = new Node<Item>(item);
        newNode.next = top;
        top = newNode;
        size++;
    }
    
    /**
     * 弹栈
     * @return
     */
    public Item pop() {
        Node<Item> returnNode = top;
        top = top.next;
        returnNode.next = null;//释放原栈顶next的引用
        size--;
        return returnNode.item;
    }
    
    /**
     * 返回栈顶元素
     * @return
     */
    public Item peek() {
        if(isEmpty()) {
            throw new RuntimeException("空栈");
        }
        return top.item;
    }
    
    /**
     * 返回栈的大小
     * @return
     */
    public int size() {
        return size;
    }
    
    /**
     * 判断栈是否为空
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }
    
    /**
     * 遍历栈
     */
    @Override
    public Iterator<Item> iterator() {
        return new Iterator<Item>() {
            private Node<Item> current = top;
            @Override
            public boolean hasNext() {
                return current != null;
            }

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

 

posted @ 2018-06-03 14:02  sowhat1943  阅读(278)  评论(0编辑  收藏  举报