
#ifdef GNU
#define std 
#include <iostream.h>
#else
#include <iostream>
#endif
#include "list.h"
#include "stack.h"
void
main( )
{
    List< int > int_list;
    List <int> l2;

    int_list.Insert( 5 );
    int_list.Insert( 10 );
    int_list.Insert( 8 );
    
    std::cout << "Initial list: " << int_list<< std::endl;

    l2 = int_list;
    std::cout << "Assignment operator works!: " << l2 << std::endl;

    std::cout << "Results of  Find(4): " << int_list.Find( 4 ) << std::endl;
    std::cout << "Results of  Find(10): " << int_list.Find( 10 ) << std::endl;

    int_list.Delete( 10 );
    std::cout << "List after deleting 10 (middle element): "
	      << int_list<< std::endl;
    
    // A stack of int; demo of push, pop and ouput routines
//1     Stack<int> sint;
//1     sint.Push(1);
//1     sint.Push(2);
//1     sint.Push(3);
//1     std::cout << sint<< std::endl;

//2     std::cout << "Pop Value " << sint.Pop() << std::endl;
//2     std::cout << sint<< std::endl;

     //Illustrating Polymorphism
//3      List<int> *ListLike = &sint;
//3      ListLike->Insert(6);
//3      ListLike->Insert(7);
//3      std::cout << sint<< std::endl;
//3      ListLike = &int_list;
//3      ListLike->Insert(6);
//3      ListLike->Insert(7);
//3      std::cout << int_list << std::endl;

     //Exposing Implementation
//4      sint.Delete(2);
//4      std::cout << "After deleting 2:" <<  sint<< std::endl;
    
}
