Advertisement
Guest User

e

a guest
Dec 11th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. template <class T> class Link;
  8. template <class T> class List;
  9. template <class T> class Iterator;
  10.  
  11. // ======================================================================
  12. //                    Template Class list
  13. // ======================================================================
  14. template <class T>
  15. class List {
  16. protected:
  17.     Link <T> *first;                // data field
  18.  
  19. public:
  20.     List() : first(nullptr) {}      // default constructor
  21.     List(const List &source);       // copy constructor
  22.     virtual ~List() {};                // destructor
  23.  
  24.     virtual void add(T value);      // insert a new item
  25.     virtual void deleteAll();
  26.     T firstElement() const;        // access the first item
  27.     virtual bool includes(T value) const;  // inclusion test
  28.     bool isEmpty() const;
  29.     virtual void removeFirst();
  30.    
  31.     friend class Iterator <T>;
  32. };
  33. // ======================================================================
  34. //                    Template Class link
  35. // ======================================================================
  36. template <class T>
  37. class Link {
  38. private:
  39.     T value;
  40.     Link <T> *next;
  41.  
  42.     Link(T val, Link *ptr) : value(val), next(ptr) { }
  43.    
  44.    
  45. public:
  46.     Link <T> *insert(T value);      // after current Link
  47.  
  48.     friend class List <T>;
  49.     friend class Iterator <T>;
  50. };
  51.  
  52. // ======================================================================
  53. //                    Template Class link - attributes
  54. // ======================================================================
  55. template <class T> Link <T> * Link <T> ::insert(T value) {
  56.     next = new Link <T>(value, next);
  57.     return next;
  58. }
  59.  
  60. // ======================================================================
  61. //                    Template Class list - attributes
  62. // ======================================================================
  63. template <class T> void List <T> ::add(T value)
  64. {
  65.     first = new Link <T>(value, first);
  66. }
  67.  
  68. template <class T> T List <T> ::firstElement() const
  69. {
  70.     assert(first != nullptr);
  71.     return first->value;
  72. }
  73.  
  74.  
  75. template <class T> bool List <T> ::isEmpty() const
  76. {
  77.     return first == nullptr;
  78. }
  79.  
  80.  
  81. template <class T> bool List <T> ::includes(T value) const
  82. {
  83.     for (Link <T> *p = first; p; p = p->next)
  84.         if (value == p->value)return true;
  85.     return false;
  86. }
  87.  
  88. template <class T> void List <T> ::removeFirst() {
  89.     assert(first != nullptr);
  90.     Link <T> *ptr = first;  // save pointer to the first item
  91.     first = ptr->next;      // reassign the first node
  92.     delete ptr;
  93. }
  94.  
  95. template <class T> void List <T> ::deleteAll() {
  96.     Link <T> *next;
  97.     for (Link <T> *p = first; p; p = next) {
  98.         next = p->next;
  99.         delete p;
  100.     }
  101.     first = nullptr;
  102. }
  103.  
  104. template <class T> ostream & operator << (ostream &s, const List<T> &toDisp){
  105.     return s << toDisp.firstElement();
  106. }
  107.  
  108. template <class T>
  109. class FIFO : public List<T>
  110. {
  111.     public:
  112.         List <T> S1;
  113.         List <T> S2;
  114.        
  115.         void addToEnd(T value);
  116.         FIFO() : last(nullptr) {}
  117.         virtual void add(T value);
  118.         virtual void removeFirst();
  119.         virtual void swap();
  120.     protected:
  121.         Link <T> *last;
  122. };
  123.  
  124.  
  125. template <class T> void FIFO <T> ::add(T value) {
  126.     if (S1.isEmpty()) {
  127.         S1.add(value);
  128.         last = this->first; // handling empty List
  129.     }
  130.     else S1.add(value);
  131. }
  132.  
  133. template <class T>
  134. void FIFO <T> ::addToEnd(T value) {
  135.     if (last != nullptr)
  136.         last = last->insert(value);
  137.     else
  138.         S1.add(value);
  139. }
  140.  
  141. template <class T> void FIFO <T> ::removeFirst() {
  142.     S2.removeFirst();
  143.     if (S2.isEmpty()) last = nullptr;
  144. }
  145.  
  146. template <class T> void FIFO <T> ::swap(){
  147.     while(!S1.isEmpty()){
  148.         S2.add(S1.firstElement());
  149.         S1.removeFirst();
  150.     }
  151. }
  152.  
  153. template <class T> ostream & operator << (ostream &s, const FIFO<T> &toDisp)
  154. {
  155.     return s << toDisp.S2.firstElement();
  156. }
  157. // ======================================================================
  158. //                            main
  159. // ======================================================================
  160. int main()
  161. {
  162.    
  163.     FIFO <int> queue;
  164.    
  165.     int K, L, M, N, number;
  166.    
  167.     cin >> K;
  168.     for (int i = 0; i < K; i++)
  169.     {
  170.         cin >> number;
  171.         queue.addToEnd(number);
  172.     }
  173.    
  174.     queue.swap();
  175.     cin >> L;
  176.     for (int i = 0; i < L; i++) {
  177.         queue.removeFirst();
  178.     }
  179.    
  180.     cin >> M;
  181.    
  182.     for (int i = 0; i < M; i++)
  183.     {
  184.         cin >> number;
  185.         queue.addToEnd(number);
  186.     }
  187.    
  188.     cin >> N;
  189.    
  190.     if(K-L < N)
  191.         queue.swap();
  192.        
  193.     for (int i = 0; i < N; i++) {
  194.         queue.removeFirst();
  195.     }
  196.     queue.swap();
  197.    
  198.     while(!queue.S2.isEmpty()){
  199.         cout << queue << " ";
  200.         queue.removeFirst();
  201.     }
  202.    
  203.    
  204.     return 1;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement