import java.util.Iterator;
import java.util.Scanner;
public class Stack<Item> implements Iterable<Item> {
private Node first;// 栈顶
private int N;// 元素数量
// 定义结点的嵌套类
private class Node{
Item item;
Node next;
}
public boolean isEmpty() { return N==0; }
public int size() { return N; }
public void push(Item item){
Node oldfirst=first;
first=new Node();
first.item=item;
first.next=oldfirst;
N++;
}
public Item pop(){
Item item=first.item;
first=first.next;
N--;
return item;
}
@Override
public Iterator<Item> iterator() {
return new ListIterator();
}
private class ListIterator implements Iterator<Item>{
private Node 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() {}
}
public static void main(String[] args) {
Stack<String> s=new Stack<String>();
Stack<String> all=new Stack<String>();
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
String item=cin.next();
if(item.equals("$")) break;
if(!item.equals("-")){
s.push(item);
all.push(item);
System.out.print("push "+item);
}
else if(!s.isEmpty()){
System.out.print("pop "+s.pop());
}
System.out.println(" | "+s.size()+" left on stack");
}
// Test iterator
for(String str : all){
System.out.print(str+" ");
}
System.out.println();
}
}
// Test example
to be or not to - be - - that - - - is $
push to | 1 left on stack
push be | 2 left on stack
push or | 3 left on stack
push not | 4 left on stack
push to | 5 left on stack
pop to | 4 left on stack
push be | 5 left on stack
pop be | 4 left on stack
pop not | 3 left on stack
push that | 4 left on stack
pop that | 3 left on stack
pop or | 2 left on stack
pop be | 1 left on stack
push is | 2 left on stack
is that be to not or be to