【Weiss】【第03章】练习3.26:双端队列

【练习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 }
View Code

 

实现代码:

 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 };

 

posted @ 2015-03-21 04:27  猫薄荷喂狗  阅读(906)  评论(0编辑  收藏  举报