下压栈
package base.第一章.背包_队列_和栈.api.下压栈;
import java.util.Iterator;
/**
* Created by MK on 2018/7/19.
* 创建栈(Stack)---以链表的方式实现
* public class Stack<Item> implements Iterable<Item>
* Stack() 创建一个空栈
* void push(Item item) 添加一个元素
* Item pop() 删除最近添加的元素
* boolean isEmpty() 栈是否为空
* int size() 栈中的元素数量
*/
public class Stack<Item> implements Iterable<Item> {
private Node<Item> node; //创建头节点
private int n;
//定义节点的嵌套类
private class Node<Item> {
Item item; //所传参数的值
Node next; //节点的指针
}
public boolean isEmpty() {
return node.next == null;
}
public int size() {
return n;
}
public void push(Item item) {
Node oldNode = node; //此时的节点变成了老节点
node = new Node<Item>(); //创建新节点
node.item = item; //将值赋值给新节点
node.next = oldNode; //新节点的下标指向的是老节点
n++;
}
public Item pop() {
Item item = node.item;
node = node.next; //跳过节点
n--;
return item;
}
//实现迭代
@Override
public Iterator<Item> iterator() {
return new ListIterator();
}
private class ListIterator implements Iterator<Item> {
private Node current = node;
public boolean hasNext() {
return current != null;
}
public Item next() {
Item item = (Item) current.item;
current = current.next;
return item;
} }
}
测试
package base.第一章.背包_队列_和栈.api.下压栈;
import edu.princeton.cs.algs4.StdOut;
/**
* Created by MK on 2018/7/19.
* 测试Stack
*/
public class 下压栈测试 {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(32);
stack.push(1);
stack.push(21);
stack.push(3); //3是最后放入的,类似于放在桌面上的邮件,其是最后一封
stack.pop(); //栈的删除,删除的是最后放入的
//foreach循环 栈的话,输出顺序与被压入的顺序正好相反。例如上面的测试例子:32是最先压入的,那么循环的话32就在最底层显示
for (Integer res : stack) {
StdOut.println(res);
}
}
}