#include <iostream>
#ifdef __BORLANDC__
#else
  using namespace std;
#endif

class Kolejka
  {
   protected:
   struct Element
     {
      double Dane;
      Element *Nastepny;
     };
   Element *Pierwszy,*Ostatni;
   virtual void _dodaj(double x);
   virtual void _pobierz(double &x);
   public:
   class StosPusty{};
   Kolejka():Pierwszy(0),Ostatni(0) {}
   virtual ~Kolejka();
   operator bool()const { return(Pierwszy); }
   Kolejka &operator<<(double x) { _dodaj(x); return(*this); }
   Kolejka &operator>>(double &x) { _pobierz(x); return(*this); }
   friend ostream &operator<<(ostream &s,const Kolejka &S);
  };

Kolejka::~Kolejka()
  {
   while(Pierwszy)
     {
      Element *Tmp=Pierwszy->Nastepny;
      delete Pierwszy;
      Pierwszy=Tmp;
     }
  }

void Kolejka::_dodaj(double x)
  {
   Element *Nowy=new Element;
   Nowy->Dane=x;
   Nowy->Nastepny=0;
   if(Ostatni) Ostatni->Nastepny=Nowy;
   else Pierwszy=Nowy;
   Ostatni=Nowy;
  }

void Kolejka::_pobierz(double &x)
  {
   Element *Stary=Pierwszy;
   if(!Stary) throw StosPusty();
   Pierwszy=Stary->Nastepny;
   if(!Pierwszy) Ostatni=0;
   x=Stary->Dane;
   delete Stary;
  }

ostream &operator<<(ostream &s,const Kolejka &S)
  {
   s<<'{';
   Kolejka::Element *i=S.Pierwszy;
   if(i)
     {
      while(true)
        {
         s<<i->Dane;
         i=i->Nastepny;
         if(!i) break;
         s<<',';
        }
     }
   return(s<<'}');
  }

int main()
  {
   Kolejka S;
   double N=5;

   S<<3.0<<4.0<<N;

   cout<<S<<endl;
   if(S)
     {
      double a,b,c;

      S>>a>>b>>c;
      cout<<a<<','<<b<<','<<c<<endl;
     }


#ifdef __BORLANDC__
   cin.get();
#endif
   return(0);
  }
