层层递进的用数组实现栈

固定容量固定数据类型的栈

package com.ttpfx.fundamentals.stack;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class FixedCapacityStackOfStrings {
    private String[] strings;
    private int N = 0;

    public FixedCapacityStackOfStrings(int size) {
        strings = new String[size];
    }

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

    public int size() {
        return N;
    }

    public void push(String s) {
        strings[N++] = s;
    }

    public String pop() {
        return strings[--N];
    }

    // 测试输入:to be or not to - be - - that - - - is
    public static void main(String[] args) {
        FixedCapacityStackOfStrings stack = new FixedCapacityStackOfStrings(100);
        while (!StdIn.isEmpty()) {
            String item = StdIn.readString();
            if (!item.equals("-")) {
                stack.push(item);
            } else if (!stack.isEmpty()) {
                StdOut.print(stack.pop() + " ");
            }
        }
        StdOut.println("(" + stack.size() + " left on stack)");
    }
}

使用泛型

package com.ttpfx.fundamentals.stack;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class FixedCapacityStack<Item> {
    private Item[] items;
    private int N = 0;

    public FixedCapacityStack(int size) {
        items = (Item[]) new Object[size];
    }

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

    public int size() {
        return N;
    }

    public void push(Item item) {
        items[N++] = item;
    }

    public Item pop() {
        return items[--N];
    }

    // 测试输入:to be or not to - be - - that - - - is
    public static void main(String[] args) {
        FixedCapacityStack stack = new FixedCapacityStack(100);
        while (!StdIn.isEmpty()) {
            String item = StdIn.readString();
            if (!item.equals("-")) {
                stack.push(item);
            } else if (!stack.isEmpty()) {
                StdOut.print(stack.pop() + " ");
            }
        }
        StdOut.println("(" + stack.size() + " left on stack)");
    }
}

可动态调整容量的栈

package com.ttpfx.fundamentals.stack;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

import java.util.Iterator;

public class ResizingArrayStack<Item> implements Iterable<Item> {
    private Item[] items = (Item[]) new Object[1];
    private int N;

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

    public int size() {
        return N;
    }

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

    public Item pop() {
        Item item = items[--N];
        items[N] = null; // 避免对象游离
        if (N > 0 && N == items.length / 4) {
            resize(items.length / 2);
        }
        return item;
    }

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

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

    private class ResizingArrayStackIterator implements Iterator<Item> {
        private int i = N;

        @Override
        public boolean hasNext() {
            return i > 0;
        }

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

    // 测试输入:to be or not to - be - - that - - - is
    public static void main(String[] args) {
        ResizingArrayStack<String> stack = new ResizingArrayStack<>();
        while (!StdIn.isEmpty()) {
            String item = StdIn.readString();
            if (!item.equals("-")) {
                stack.push(item);
            } else if (!stack.isEmpty()) {
                StdOut.print(stack.pop() + " ");
            }
        }
        StdOut.println("(" + stack.size() + " left on stack)");

        for (String item : stack) {
            System.out.println(item);
        }
    }
}
posted @ 2020-11-04 08:42  ttpfx  阅读(69)  评论(0)    收藏  举报