• stack栈、queue队列、list链表容器


    目录

    stack栈容器

    stack概念和定义

    stack构造函数:

    stack数据操作:

    queue队列容器

    queue概念和定义

    queue构造函数

    queue数据操作

    list链表容器

    list概念和定义

    list构造函数

    list赋值和交换

    list大小操作

    list插入和删除

    list数据储存

    list反转和排序


    stack栈容器

    stack概念和定义

    栈的数据结构特性是:先入后出,后入先出,只能从栈顶插入、删除和访问。可将栈视为一叠盘子,最后叠上去的盘子首先被取下来,而不能从中间或底部取出盘子。

    stack构造函数:

    stackstk;//stack采用模板类实现,stack对象的默认构造形式

    stack(const stack &stk);//拷贝构造函数

    stack数据操作:

    stack& operator=(const stack &stk);//重载等号操作符

    push(elem);//向栈顶添加元素

    pop();//从栈顶移除第一个元素

    top();//返回栈顶元素

    stack大小操作:

    empty();//判断堆栈是否为空

    size(0);//返回栈的大小

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. using namespace std;
    12. void test()
    13. {
    14. stack<int> s;
    15. s.push(10);
    16. s.push(20);
    17. s.push(30);
    18. s.push(40);
    19. cout<< "栈的大小为:"<< s.size() << endl;
    20. while(!s.empty())//判断栈是否为空
    21. {
    22. cout << "栈顶元素为:" << s.top()<< endl;
    23. s.pop();//移除栈顶元素
    24. }
    25. cout<< "栈的大小为:"<< s.size() << endl;
    26. }
    27. int main()
    28. {
    29. test();
    30. return 0;
    31. }

    编译运行

    queue队列容器

    queue概念和定义

    队列的数据结构特性是:先进先出,允许在开头删除,在末尾插入,类似排队系统。

    队列容器允许从一端新增元素,从另一端移除元素

    队列中只有对头和队尾才可以被外界使用,因此队列不允许有遍历行为

    队列中进数据称为入队,出数据称为出队

    queue构造函数

    queue que;//queue采用模板类实现,queue对象的默认构造形式

    queue(const queue &que); //拷贝构造函数

    queue数据操作

    queue& operator=(const queue &que); //重载等号操作符

    push(elem);//往队尾添加元素

    pop();//从队头移除第一个元素

    back();//返回最后一个元素

    front();//返回第一个元素

    empty();判断是否尾空

    size();//返回大小

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. using namespace std;
    13. void test()
    14. {
    15. queue<int> q;
    16. q.push(10);
    17. q.push(20);
    18. q.push(30);
    19. q.push(40);
    20. while(!q.empty())//判断栈是否为空
    21. {
    22. cout << "对头元素为:" << q.front()<< endl;
    23. cout << "对尾元素为:" << q.back()<< endl;
    24. q.pop();//移除队头
    25. }
    26. cout<< q.size() << endl;
    27. }
    28. int main()
    29. {
    30. test();
    31. return 0;
    32. }

    编译运行

    list链表容器

    list概念和定义

    list是双向链表的一个泛化容器,它的数据元素可通过链表指针串接成逻辑意义上的线性表。不同于采用线性表顺序存储结构的vector和deque容器,list双向链表中任一位置的元素查找、插入和删除,都具有高效的常数阶算法时间复杂度

    list的优点:
            采用动态存储分配,不会造成内存浪费和溢出
            链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素list的缺点:
            链表灵活,但是空间(指针域)和时间(遍历) 额外耗费较大List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的.

    list构造函数

    listlst;//list采用采用模板类实现,对象的默认构造形式:
    list(beg,end);//构造函数将[beg,end)区间中的元素拷贝给本身
    list(n,elem);//构造函数将n个elem拷贝给本身。
    list(const list &lst);//拷贝构造函数。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. using namespace std;
    14. void print(const list<int>&L)
    15. {
    16. for(list<int>::const_iterator it = L.begin();it!=L.end();it++)
    17. {
    18. cout << *it << " ";
    19. }
    20. cout << endl;
    21. }
    22. void test()
    23. {
    24. list<int>L1;
    25. L1.push_back(10);
    26. L1.push_back(20);
    27. L1.push_back(30);
    28. L1.push_back(40);
    29. print(L1);
    30. list<int>L2(L1.begin(),L1.end());
    31. print(L2);
    32. list<int>L3(L2);
    33. print(L3);
    34. list<int>L4(10,40);
    35. print(L4);
    36. }
    37. int main()
    38. {
    39. test();
    40. return 0;
    41. }

    编译运行

    list赋值和交换

    assign(beg,end);//将[begend)区间中的数据拷贝赋值给本身
    assign(n,elem);//将n个elem拷贝赋值给本身。
    list& operator=(const list &lst);//重载等号操作竹
    swap(lst)://将lst与本身的元素互换

    1. void print(const list<int>&L)
    2. {
    3.     for(list<int>::const_iterator it = L.begin();it!=L.end();it++)
    4.     {
    5.         cout << *it << " ";
    6.     }
    7.     cout << endl;
    8. }
    9. void test()
    10. {
    11.     list<int>L1;
    12.     L1.push_back(10);
    13.     L1.push_back(20);
    14.     L1.push_back(30);
    15.     L1.push_back(40);
    16.     print(L1);
    17.     list<int>L2(10,40);
    18.     print(L2);
    19.     cout << "交换后: "<< endl;
    20.     L2.swap(L1);
    21.     print(L1);
    22.     print(L2);
    23. }

    编译运行

    list大小操作

    size();//返回容器中的个数
    empty();//判断容器是否为空
    resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置
                          //如果容器变短,则末尾超出容器长度的元素被制除。
    resize(num,elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置                                                //如果容器变短,则末尾超出容器长度的元素被删除。

    list插入和删除

            push_back(elem);//在容器尾部加入一个元素
            pop_back0)://删除容器中最后一个元素
            push front(elem)://在容器开头插入一个元妻
            pop_front()://从容器开头移除第一个元素
            insert(pos,elem)://在pos位置插elem元素的拷贝,返回新数据的位置
            insert(pos,n,elem)://在pos位置插入n个elem数据,无返回值
            insert(pos,beg,end);//在pos位置插入[begend)区间的数据,无返回值
            clear();//移除容器的所有数据
            erase(beg,end)://删除[begend)区间的数据,返回下一个数据的位置
            erase(pos)://删除pos位置的数据,返回下一个数据的位置
            remove(elem)://删除容器中所有与elem值匹配的元素

    list数据储存

    front();//返回第一个元素

    back();//返回最后一个元素

    void test()
    {
        list L1;
        L1.push_back(10);
        L1.push_back(20);
        L1.push_back(30);
        L1.push_back(40);

        cout << "第一个元素: " << L1.front() << endl;
        cout << "最后一个元素: " << L1.back() << endl;

        //L1[0]不可以用[]访问list容器的元素

        //L1.at(0) 不可以用at方式访问list容器里的元素

        //原因是list本质链表 不是用连续线空间存储数据,迭代器也不支持随机访问
        list::iterator it = L1.begin();

        it++;//支持双向
        it--;
    //  it = it + 1;//不支持随机访问
    }

    list反转和排序

    reverse();//反转链表

    sort();//链表排序(成员函数)

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. using namespace std;
    14. void print(const list<int>&L)
    15. {
    16. for(list<int>::const_iterator it = L.begin();it!=L.end();it++)
    17. {
    18. cout << *it << " ";
    19. }
    20. cout << endl;
    21. }
    22. bool myc(int v1,int v2)
    23. {
    24. //降序 就让第一个数大于第二个数
    25. return v1 > v2;
    26. }
    27. void test01()
    28. {
    29. list<int>L1;
    30. L1.push_back(20);
    31. L1.push_back(10);
    32. L1.push_back(40);
    33. L1.push_back(30);
    34. L1.push_back(70);
    35. print(L1);
    36. L1.reverse();
    37. print(L1);
    38. }
    39. void test02()
    40. {
    41. list<int>L1;
    42. L1.push_back(20);
    43. L1.push_back(10);
    44. L1.push_back(40);
    45. L1.push_back(30);
    46. L1.push_back(70);
    47. print(L1);
    48. //所有不支持随机访问迭代器的容器,不可以用标准算法
    49. //不支持随机访迭代器的容器,内部会提供对应的一些算法
    50. //sort(L1.begin(),L1.end());
    51. L1.sort();
    52. print(L1);
    53. //L1.sort(myc);降序排列
    54. }
    55. int main()
    56. {
    57. test01();
    58. cout << endl;
    59. test02();
    60. return 0;
    61. }

    编译运行

  • 相关阅读:
    Docker系列--在容器中安装JDK的方法(有示例)
    【MySQL】初识数据库
    Blog - Hexo 搭建个人博客
    cv2.cvtColor()将二维转化为彩色图像
    DataFrame持久存储
    [好题][曼哈顿距离][二分]Taxi 2022杭电多校第3场 1011
    Windows系统Bat命令批量重命名文件
    [ Linux ] 重定向的再理解,以及文件系统的理解、inode和软硬链接
    docker修改挂载目录
    C++笔记之popen()和std_system()和std_async()执行系统命令比较
  • 原文地址:https://blog.csdn.net/2301_77164542/article/details/133203761