import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Stack <Item> implements Iterable<Item>{
public static void main(String[]args){
Stack<Character> s=new Stack<>();
for (int i=0;i<26;i++)
s.push((char)('a'+i));
Stack<Character> t=new Stack<>(s);
int N=s.size();
for (int i=0;i<N;i++)
StdOut.print(s.pop()+" ");
StdOut.println();
for (char c:t)
StdOut.print(c+" ");
StdOut.println();
}
private Node first; //top of stack (most recently added node)
private int N; //number of items
private class Node{
//nested class to define nodes
Item item;
Node next;
}
public Stack(){
first=null;
N=0;
}
public Stack(Stack<Item> s){//1.3.42
Stack<Item> temp=new Stack<>();
int N=s.size();
for (int i=0;i<N;i++)
temp.push(s.pop());
for (int i=0;i<N;i++) {
Item item = temp.pop();
push(item);
s.push(item);
}
}
public boolean isEmpty() {return first==null;} //Or: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(){
//Remove item from top of stack.
Item item=first.item;
first=first.next;
N--;
return item;
}
public Item peek(){
if (isEmpty()){
throw new NoSuchElementException("Stack underflow!");
}
return first.item;
}
public static <Item1> Stack<Item1> copy(Stack<Item1> s){
Stack<Item1> result=new Stack<>();
Stack<Item1> temp=new Stack<>();
Iterator<Item1> iterator=s.iterator();
while (iterator.hasNext())
temp.push(iterator.next());
iterator=temp.iterator();
while (iterator.hasNext())
result.push(iterator.next());
return result;
}
public Iterator<Item> iterator(){
return new StackIterator();
}
private class StackIterator implements Iterator<Item>{
private Node current=first;
public boolean hasNext(){
return current!=null;
}
public void remove(){}
public Item next(){
Item item=current.item;
current=current.next;
return item;
}
}
}