固定容量固定数据类型的栈
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);
}
}
}