zoukankan      html  css  js  c++  java
  • 【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 << "
    /*end*/
    
    " << 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 };
  • 相关阅读:
    C#中的委托(delegate)用法简介 dodo
    SqlServer2000日志文件过大问题处理 dodo
    prototype.js 显示等待状态 dodo
    linux常用命令 dodo
    关于NavigateUrl中绑定Eval()方法时出现"服务器标记的格式不正确"的解决方法 dodo
    DataGridViewRowHeadersWidthSizeMode属性和ColumnHeadersHeightSizeMode属性 dodo
    注销时跳出框架 dodo
    DriveInfo类取得计算机的磁盘信息 dodo
    类序列化 dodo
    CutEditor在线编辑器的使用 dodo
  • 原文地址:https://www.cnblogs.com/catnip/p/4355071.html
Copyright © 2011-2022 走看看