home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / GCC / GERLIB_DEV08B.LHA / gerlib / libg++ / etc / ADT-examples / generic-q.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-12  |  3.8 KB  |  116 lines

  1. // From: "Douglas C. Schmidt" <schmidt@glacier.ics.uci.edu>
  2. // Date: Sun, 25 Sep 88 16:19:35 -0700
  3.  
  4. #ifdef amiga
  5. #include <use_standard_argc_argv.h>
  6. #endif
  7.  
  8. #include <stream.h>
  9. #include <ctype.h>
  10. #ifdef amiga
  11. #include <_String.h>
  12. #else
  13. #include <String.h>
  14. #endif
  15. #include <generic.h>
  16. #include <stdlib.h>
  17.  
  18. #define queue(type) name2(type,queue)
  19. #define list(type) name2(type,list)
  20. #define queuedeclare(type)                     \
  21. class queue(type) {                            \
  22.    struct list(type) {                         \
  23.       type item;                               \
  24.       list(type) *next;                        \
  25.    } *head;                                    \
  26.    int sz;                                     \
  27. public:                                        \
  28.    queue(type)(void) {head = 0;sz = 0;}        \
  29.    ~queue(type)(void) {                        \
  30.       list(type) *temp;                        \
  31.       while (head) {                           \
  32.          temp = head;                          \
  33.          head = head->next;                    \
  34.          delete temp;                          \
  35.       }                                        \
  36.    }                                           \
  37.    int  empty(void) {return(!head);}           \
  38.    int  size(void) {return(sz);}               \
  39.    void enqueue(type new_item);                \
  40.    type front(void) {                          \
  41.       return(head->next->item);                \
  42.    }                                           \
  43.    type dequeue(void);                         \
  44. };
  45.  
  46. #define queueimplement(type)                   \
  47. type queue(type)::dequeue(void) {              \
  48.    if (!head)                                  \
  49.       abort();                                 \
  50.    type temp = head->next->item;               \
  51.    list(type) *temp_ptr;                       \
  52.    if ((temp_ptr = head->next) == head) {      \
  53.       head = 0;                                \
  54.    }                                           \
  55.    else {                                      \
  56.       head->next = temp_ptr->next;             \
  57.    }                                           \
  58.    delete temp_ptr;                            \
  59.    sz--;                                       \
  60.    return(temp);                               \
  61. }                                              \
  62. void queue(type)::enqueue(type new_item) {     \
  63.    if (!head) {                                \
  64.       head       = new list(type);             \
  65.       head->item = new_item;                   \
  66.       head->next = head;                       \
  67.    }                                           \
  68.    else {                                      \
  69.       list(type) *temp_node  = new list(type); \
  70.       temp_node->item  = new_item;             \
  71.       temp_node->next  = head->next;           \
  72.       head->next       = temp_node;            \
  73.       head             = temp_node;            \
  74.    }                                           \
  75.    sz++;                                       \
  76. }                                              \ 
  77.  
  78.  
  79. queuedeclare(String);
  80. queueimplement(String);
  81. queuedeclare(double);
  82. queueimplement(double);
  83.  
  84. #ifdef amiga
  85. int main(int argc, char *argv[]) {
  86. #else
  87. main () {
  88. #endif
  89.    String Buf;
  90.    queue(String) Q_String;
  91.    queue(double) Q_double;
  92.  
  93.    while (cin >> Buf) {
  94.       if (Buf.matches(RXalpha)) {
  95.          Q_String.enqueue(String(Buf));
  96.       }
  97.       else if (Buf.matches(RXdouble)) {
  98.          Q_double.enqueue(atof(Buf));
  99.       }   
  100.    }
  101.  
  102.    while (!Q_String.empty()) {
  103.       cout << "Size = " << Q_String.size() << ",Item = "
  104.            << Q_String.front() << "\n";
  105.       void(Q_String.dequeue());
  106.    }
  107.  
  108.    while (!Q_double.empty()) {
  109.       cout << "Size = " << Q_double.size() << ",Item = " 
  110.            << Q_double.front() << "\n";
  111.       void(Q_double.dequeue());
  112.    }
  113.    return (0);
  114. }
  115.  
  116.