栈的定义
先进后出的数据结构栈API
stack();构造函数
int size();栈容量
boolean isEmpty();栈是否为空
void push(Item item);入栈
Item pop(); 出栈
Item peek(); 获取栈顶元素栈的实现
使用单链表实现,并支持迭代查询
package xwq.dt;
import java.util.Iterator;
import java.util.NoSuchElementException;
import xwq.util.StdIn;
import xwq.util.StdOut;
/**
* Compilation: javac Stack.java
* Execution: java Stack < input.txt
* Dependencies: StdIn.java StdOut.java
*
* 使用单链表实现的栈
*
* @author xwq
*
* @param <Item>
*/
public class Stack<Item> implements Iterable<Item>{
private Node<Item > first;//栈顶结点
private int N;//栈大小
private static class Node<Item> {
Item item;
Node<Item > next;
}
public Stack() {
first = null;
N = 0;
}
public boolean isEmpty() {
return first == null;
}
public int size() {
return N;
}
/**
* 入栈
* @param item
*/
public void push(Item item) {
Node<Item > newNode = new Node<Item>();
newNode.item = item;
newNode.next = first;
first = newNode;
N++;
}
/**
* 出栈
* @return
*/
public Item pop() {
if(isEmpty())
throw new NoSuchElementException("栈为空,不能执行pop操作!");
Item item = first.item;
first = first.next;
N--;
return item;
}
/**
* 获取栈顶元素
* @return
*/
public Item peek() {
if(isEmpty())
throw new NoSuchElementException("栈为空,不能执行pop操作!");
return first.item;
}
@Override
public Iterator<Item> iterator() {
// TODO Auto-generated method stub
return new ListIterator<Item>(first);
}
private class ListIterator<Item > implements Iterator<Item> {
private Node<Item > current;
public ListIterator(Node<Item> first) {
current = first;
}
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Item next() {
Item item = current.item;
current = current.next;
return item;
}
@Override
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException("不支持删除操作");
}
}
/**
* 测试函数
* @param args
*/
public static void main(String[] args) {
Stack<String > stack = new Stack<String>();
while(!StdIn.isEmpty()) {
String s = StdIn.readString();
if(!s.equals("-")) stack.push(s);
else if(!stack.isEmpty()) StdOut.println(stack.pop());
}
StdOut.println("size: " + stack.size());
}
}