标签:
【练习3.26】
双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作:
Push(X,D):将项X插入到双端队列D的前端。
Pop(D):从双端队列D中删除前端项并返回。
Inject(X,D):将项X插入到双端队列D的尾端。
Eject(D):从双端队列D中删除尾端项并返回。
编写支持双端队列的例程,每种操作均花费O(1)时间。
Answer:
相当简单的题目,把改一改双向链表就可以了。
测试代码:
1 #include <iostream> 2 #include "double_linklist.h" 3 using namespace std; 4 using namespace doublelinklist; 5 template class DList<int>; 6 int main(void) 7 { 8 DList<int> number; 9 number.additem(2); 10 number.additem(3); 11 number.additem(5); 12 number.additem(7); 13 14 //测试前后插入 15 number.push(11); 16 number.inject(13); 17 number.inject(17); 18 number.push(19); 19 number.traverse(); 20 cout << "\n/*end*/\n\n" << flush; 21 22 //测试前后删除 23 number.pop(); 24 number.pop(); 25 number.pop(); 26 number.eject(); 27 number.eject(); 28 number.traverse(); 29 30 system("pause"); 31 }
实现代码:
1 //练习3.26新增,实现双端队列的四个操作 2 template<typename T> bool DList<T>::push(const T &item) 3 { 4 Node<T>* pnew = new Node<T>(item); 5 //原链表无元素 6 //头尾指针均指向新节点,且新节点前后指针默认为nullptr 7 if (length == 0) 8 front = rear = pnew; 9 else 10 { 11 pnew->next = front; 12 front->prev = pnew; 13 front = pnew; 14 } 15 ++length; 16 return true; 17 } 18 template<typename T> bool DList<T>::pop() 19 { 20 if (length == 0) 21 { 22 cout << "Empty deque!" << endl; 23 return false; 24 } 25 Node<T>* temp = front; 26 if (length == 1) 27 front = rear = nullptr; 28 else 29 { 30 front = front->next; 31 front->prev = nullptr; 32 } 33 delete temp; 34 --length; 35 return true; 36 } 37 template<typename T> bool DList<T>::inject(const T &item) 38 { 39 return additem(item); 40 } 41 template<typename T> bool DList<T>::eject() 42 { 43 if (length == 0) 44 { 45 cout << "Empty deque!" << endl; 46 return false; 47 } 48 Node<T>* temp = rear; 49 if (length == 1) 50 front = rear = nullptr; 51 else 52 { 53 rear = rear->prev; 54 rear->next = nullptr; 55 } 56 delete temp; 57 --length; 58 return true; 59 };
标签:
原文地址:http://www.cnblogs.com/catnip/p/4355071.html