Website Summary Files Commits Branches @commit @diff @stats
path: root / Additional / concatenate-queues.cpp
diff options
context:
space:
mode:
Commit8c1753a1a200cbe0c23c2178a35e1b8b8c57bf64 (patch)
Author
 Stoycho Kyosev <stoycho.kk@gmail.com>
2022-11-22 23:57:23 +0200
Committer
 Stoycho Kyosev <stoycho.kk@gmail.com>
2022-11-22 23:57:23 +0200
Files5ccc337050428a14c1ff73f5443d32031bbb1f38 /Additional/concatenate-queues.cpp
Data-structures-and-algorithms-8c1753a1a200cbe0c23c2178a35e1b8b8c57bf64.tar
Data-structures-and-algorithms-8c1753a1a200cbe0c23c2178a35e1b8b8c57bf64.tar.gz
Data-structures-and-algorithms-8c1753a1a200cbe0c23c2178a35e1b8b8c57bf64.zip
Parent74f5fe6f7c4222fc52479c6ef598f830f6049949 (diff)
Add additional
1 files changed, 70 insertions, 0 deletions
-rw-r--r--Additional/concatenate-queues.cpp70
diff --git a/Additional/concatenate-queues.cpp b/Additional/concatenate-queues.cpp
new file mode 100644
index 0000000..c3f772e
--- /dev/null
+++ b/Additional/concatenate-queues.cpp
@@ -0,0 +1,70 @@
+#include"../Seminar04/linked-list-utils.h"
+#include<iostream>
+#include<queue>
+
+using ListNode = LinkedListNode<std::queue<int>>;
+
+void concatenate(std::queue<int>& to, std::queue<int>& from) {
+ while(!from.empty()) {
+ to.push(from.front());
+ from.pop();
+ }
+}
+
+bool all(std::queue<int> q, bool (*pred)(int)) {
+ while(!q.empty()) {
+ if(!pred(q.front())) {
+ return false;
+ }
+ q.pop();
+ }
+
+ return true;
+}
+
+void concatenateSimilarQueues(ListNode* ll, bool (*pred)(int)) {
+ if(!ll || !ll->next)
+ return;
+
+ ListNode* iter = ll;
+
+ while(iter && iter->next) {
+ if(all(iter->data, pred)) {
+ while(iter->next && all(iter->next->data, pred)) {
+ ListNode* toDelete = iter->next;
+ iter->next = iter->next->next;
+ concatenate(iter->data, toDelete->data);
+
+ delete toDelete;
+ }
+ }
+ iter = iter->next;
+ }
+}
+
+void printQueue(std::queue<int> q) {
+ std::cout << "[ ";
+ while(!q.empty()) {
+ std::cout << q.front() << " ";
+ q.pop();
+ }
+ std::cout << " ]" << std::endl;
+}
+
+int main() {
+ ListNode* ll = fromList({
+ std::queue<int>({1, 2, 3}),
+ std::queue<int>({4, 5, 6, 7, 8, 8, 9}),
+ std::queue<int>({12, 14, 16}),
+ std::queue<int>({101, 102}),
+ std::queue<int>({103, 104, 105})
+ });
+
+ concatenateSimilarQueues(
+ ll,
+ [](int x) -> bool { return x < 10 || x > 100; }
+ );
+
+ printLinkedList(ll, printQueue);
+ freeList(ll);
+} \ No newline at end of file