From d86571bd804a45f993fd8232945f55597a4f1fdf Mon Sep 17 00:00:00 2001 From: iridiumR Date: Thu, 18 Nov 2021 20:44:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=9C=E4=B8=9A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ex8/ex8.cpp | 89 +++++++++++++++++++++++++++++++++++++++++ ex8/list.hpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++ ex8/queue.hpp | 39 ++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 ex8/ex8.cpp create mode 100644 ex8/list.hpp create mode 100644 ex8/queue.hpp diff --git a/ex8/ex8.cpp b/ex8/ex8.cpp new file mode 100644 index 0000000..2715b10 --- /dev/null +++ b/ex8/ex8.cpp @@ -0,0 +1,89 @@ +#include "queue.hpp" +#include +#include +#define JIE 6 + +class Train +{ +private: + int _v[6]; + Queue come; + Queue temp[4]; + Queue out; + +public: + Train() + { + srand(time(NULL)); + + for (int i = 0; i < JIE; i++) + _v[i] = JIE - i; + for (int i = 0; i < JIE; i++) + swap(i, rand() % JIE); + printf("入队序列: \n"); + for (int i = 0; i < JIE; i++) + { + come.enqueue(_v[i]); + printf("%d ", _v[i]); + } + printf("\n"); + } + + bool orgnize() + { + int j = 0; + while (!come.empty()) + { + for (int i = 0; i < 4;) + { + if (temp[i].back() < come.front()) + { + printf("将车厢%d引入缓冲轨道%d \n", come.front(), i + 1); + temp[i].enqueue(come.dequeue()); + } + else + { + j++; + i++; + if (j > 20) + return false; + } + } + } + return true; + } + int Out() + { + for (int i = 1; i <= JIE;) + { + for (int j = 0; j < 4;j++) + { + if(temp[j].front()==i) + { + printf("将缓冲轨道%d中的车厢%d引入出发序列\n", j+1,temp[j].front()); + out.enqueue(temp[j].dequeue()); + i++; + } + } + } + return 0; + } + + + +protected: + void swap(int a, int b) + { + int temp = _v[a]; + _v[a] = _v[b]; + _v[b] = temp; + } +}; + +int main() +{ + + Train T; + T.orgnize() ? T.Out() : printf("编组失败\n"); + return 0; +} \ No newline at end of file diff --git a/ex8/list.hpp b/ex8/list.hpp new file mode 100644 index 0000000..ec63314 --- /dev/null +++ b/ex8/list.hpp @@ -0,0 +1,107 @@ +#ifndef _LIST_ +#define _LIST_ +#include +#include +#define Node node * + +template +class List +{ + typedef struct node + { + T data; + Node pred; + Node succ; + } node; + +private: + Node header = new node; + Node trailer = new node; + int _size; + +protected: + Node firstInsertN(Node New); + Node lastInsertN(Node New); + Node succInsertN(Node old, Node ne); + Node predInsertN(Node old, Node ne); + void removeN(Node i); + Node searchN(int value, int n, Node p); + +public: + int size() + { + return _size; + } + List(); + void clear(); + Node first() { return header->succ; } + Node last() { return trailer->pred; } + T firstInsert(T New); + T lastInsert(T New); + T removeLast(); + Node succInsert(Node Old, T New); + Node predInsert(Node Old, T New); + + int get(int i); + Node find(int i); + T remove(T i); + + int operator[](int i) + { + Node p = first(); + while (0 < i--) + p = p->succ; + return p->data; + } +}; + +template +List::List() +{ + _size = 0; + header->data = NULL; + header->succ = trailer; + header->pred = NULL; + + trailer->data = NULL; + trailer->succ = NULL; + trailer->pred = header; +} + +template +void List::clear() +{ + while (0 < _size) + remove(0); +} + +template +T List::firstInsert(T New) +{ + Node temp = new node; + temp->data = New; + temp->pred = header; + temp->succ = header->succ; + header->succ = temp; + temp->succ->pred = temp; + _size++; + return New; +} + +template +T List::removeLast() +{ + if (!_size) + return NULL; + + Node last = trailer->pred; + T temp = last->data; + (last->pred)->succ = last->succ; + (last->succ)->pred = last->pred; + delete[] last; + _size--; + + return temp; +} + +#endif \ No newline at end of file diff --git a/ex8/queue.hpp b/ex8/queue.hpp new file mode 100644 index 0000000..c3c6e2c --- /dev/null +++ b/ex8/queue.hpp @@ -0,0 +1,39 @@ +#ifndef _QUEUE_ +#define _QUEUE_ + +#include +#include "list.hpp" +template +class Queue +{ +private: + List q; +public: + int size() + { + return q.size(); + } + bool empty() + { + return size() ? false : true; + } + T enqueue(T e) + { + return q.firstInsert(e); + } + T dequeue() + { + return q.removeLast(); + } + T front() + { + return q.last()->data; + } + + T back() + { + return q.first()->data; + } + +}; +#endif \ No newline at end of file