codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
/* * Queue Class * Written by Aaron J. Miller (20110911) */ #include <cstdio> #include <cassert> //============================================================================== // Queue Class //============================================================================== template<typename T> class CQueue { protected: struct item_s { T obj; struct item_s *next; } *m_head, *m_tail; public: inline CQueue(): m_head((item_s *)0), m_tail((item_s *)0) { } inline ~CQueue() { while(!IsEmpty()) Pop(); } inline bool IsEmpty() { return m_head!=(item_s *)0?false:true; } inline void Push(const T &obj) { item_s *p; p = new item_s(); p->obj = obj; p->next = (struct item_s *)0; if (m_tail) m_tail->next = p; else m_head = p; m_tail = p; } inline T Pop() { item_s *next; T obj; assert(!IsEmpty()); next = m_head->next; obj = m_head->obj; delete m_head; if (!(m_head = next)) m_tail = (item_s *)0; return obj; } inline void Sort() { item_s *prev, *before, *current; bool try_again; if (m_head==m_tail) return; L_do_sort: try_again = false; prev = (item_s *)0; for ( before=m_head,current=m_head->next; current; prev=before,before=current,current=current->next ) { if (current->obj < before->obj) { try_again = true; if (!(before->next = current->next)) m_tail = before; current->next = before; if (prev) prev->next = current; else m_head = current; } } if (try_again) goto L_do_sort; } }; //============================================================================== // Test Code //============================================================================== int main() { CQueue<int> int_queue; int_queue.Push(42); int_queue.Push(23); int_queue.Push(17); int_queue.Push(47); int_queue.Push(1); int_queue.Push(2); int_queue.Push(3); int_queue.Sort(); while(!int_queue.IsEmpty()) printf("%d\n", int_queue.Pop()); return 0; }
Private
[
?
]
Run code
Submit