首页 > 其他分享 >chapter5-线性数据结构

chapter5-线性数据结构

时间:2024-02-23 11:44:59浏览次数:17  
标签:队列 include chapter5 元素 int myVector 线性 数据结构 向量

1.向量

向量(vector)是可以改变其大小的线性序列容器。像数组一样,向量使用连续的空间存储元素,这表明向量也可以像数组一般通过其下标来访问其元素。但与数组不同的是,向量的大小可以动态变化
向量在内部使用动态数组的方式来存储元素,无需关心实现细节。(平均意义下,向量插入元素的时间复杂度是常数O(1)级别)

1.1 向量构造

如何定义一个新的向量,常见的有如下几种方式:

定义一个向量
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

void print(vector<int> myVector, int n) {
    printf("vector%d: ", n);
    for(int i = 0; i < myVector.size(); ++i) {
        printf("%d ",myVector[i]);
    }
    printf("\n");
}

int main()
{
    int myArray[] = {1, 2, 3, 4, 5};

    vector<int> myVector1;      //
    vector<int> myVector2(myArray, myArray + 5);  //通过构造函数拷贝数组,区间左闭右开
    vector<int> myVector3(5, 2);      //也可以拷贝1个数组,这个数组的内容是5个2
    vector<int> myVector4(myVector2);   //可以拷贝向量
    vector<int> myVector5(myVector4.begin(), myVector4.end()-2); //也可以只拷贝一部分,左闭右开区间

    print(myVector1, 1);
    print(myVector2, 2);
    print(myVector3, 3);
    print(myVector4, 4);
    print(myVector5, 5);

    return 0;
}

vector<类型>可以是基础数据类型,也可以是自定义的数据类型如结构体等。

1.2 向量操作

即常见的系统内部已经定义的函数应该怎么使用。

1、返回向量的尺寸(元素个数):int n = myVector.size();

2、将向量尾部的值给弹出去:myVector.pop_back();

3、从向量尾部推入一个值:myVector.push_back();

4、插入操作:

  • 可以插入一个值myVector.insert(position, x);

  • 可以插入多个相同的值myVector.insert(position, n, x);

  • 可以插入一段值,myVector.insert(position, first_add, last_add);,需要给定要插入元素的数组/向量的地址区间,左闭右开,且注意向量与数组不同的地方在于不能直接用名字访问地址,而是使用封装好的函数myVector.begin()myVector.end()

5、删除操作:

  • 可以删除指定下标位置的一个元素myVector.erase(position);

  • 可以删除指定的一段下标区间内元素,左闭右开,myVector.erase(first_add, last_add);

6、清除操作:myVector.clear()

常用的向量函数
//vector定义,常见的方式 2024-02-22
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int main()
{
    int myArray[] = {1, 2, 3, 4, 5};

    vector<int> myVector(myArray , myArray+5); //通过构造函数给向量拷贝一个数组
    
    int n = myVector.size();

    myVector.pop_back();   //从向量尾部弹出一个值 1, 2, 3, 4
    
    myVector.push_back(6); //从尾部推进去一个值6  1, 2, 3, 4, 6
    //1, 9, 2, 3, 4, 6
    myVector.insert(myVector.begin() + 1 , 9); //参数1:position,插入向量的下标位置;参数2:x,要插入的值
    //7, 7, 7, 1, 9, 2, 3, 4, 6
    myVector.insert(myVector.begin(), 3, 7);   //参数1:position,插入向量的下标位置;参数2:n,插入几次;参数3:x,要插入的值   
    //1, 2, 7, 7, 7, 1, 9, 2, 3, 4, 6
    myVector.insert(myVector.begin(), myArray, myArray + 2); //position, first_address, last_address(区间左闭右开)
    //1, 2, 7, 7, 7, 1, 2, 3, 4, 6
    myVector.erase(myVector.begin() + 6); //参数1:position,删除下标为6的元素
    //1, 7, 7, 1, 2, 3, 4, 6
    myVector.erase(myVector.begin() + 1, myVector.begin() + 3);  //first_add, last_add(左闭右开) 删除从下标fisrt开始,到下标last-1之间的元素

    myVector.clear();
    return 0;
}

2.队列

在做题过程中,一旦发现有先进先出的特性时一定要首先想到队列这种数据结构。使用队列模板queue,就应在代码中添加头文件,其格式为#include <queue>。定义一个队列和定义向量非常类似,写法为queue<typename> name

2.2 queue的状态

1、判空操作,即返回当前队列是否为空:empty()

2、队列长度,返回当前队列元素个数:size()

2.3 queue元素的添加或删除

1、入队操作,即向队列中添加新的元素:push(elem)

2、出队操作,即删除已有的元素:pop()

2.4 queue元素的访问

只能对队列的头尾两端进行操作。

1、访问队首,即获得队头元素的函数:front()

2、访问队尾,即获得队尾元素的函数为:back()

常用的队列函数
//队列的定义及常用操作 2024-02-22
#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

int main()
{
    queue<int> myQueue;

    for(int i = 0; i < 10; ++i) {
        myQueue.push(i);       //入队
    }

    int sum = 0;
    while(!myQueue.empty()) {
        sum +=myQueue.front();  //访问队首
        myQueue.pop();          //出队
    }

    cout << sum << endl;
    return 0;
}

3.栈

同样,C++内部封装了容器stack,我们只要学会如何使用即可。栈的特性是后进先出规则。要使用stack的标准模板,需要添加头文件#include <stack>,栈的常用函数与队列非常相似。

3.2 stack的状态

1、**判空**操作,返回当前栈是否为空:``empty()``

2、栈长度,返回当前栈元素个数:size()

3.3 stack元素的添加或删除

1、入栈操作:定义一个栈后,要向栈中添加新元素push()

4、出栈操作:删除已有的元素pop()

3.4 stack元素的访问

只能对栈的栈顶一端进行操作,所以只能用top()来访问栈顶元素,而不像队列那样可以访问队头和队尾。

常用的栈函数
//栈的定义和常用操作 2024-02-23
#include <iostream>
#include <cstdio>
#include <stack>

using namespace std;

int main()
{
    stack<int> myStack;

    for(int i = 0; i < 10; ++i) {
        myStack.push(i);            //入栈
    }

    int sum = 0;
    while (!myStack.empty()) {     //判空
        printf("%d ", myStack.top());
        sum += myStack.top();      //访问栈顶
        myStack.pop();             //出栈
    }
    printf("\n");
    printf("%d\n",sum);
    return 0;
}

标签:队列,include,chapter5,元素,int,myVector,线性,数据结构,向量
From: https://www.cnblogs.com/paopaotangzu/p/18025728

相关文章

  • Python数据结构与算法05——快速排序
    快速排序:递归defquick_sort(aimlist,first,last):#打印当前排序状态print(aimlist)#如果子列表只有一个元素或没有元素,直接返回iffirst>=last:return#初始化低位、高位和中间值low=firstheigh=lastmid=aimli......
  • 数据结构---第一讲 基本概念
    1.1什么是数据结构数据对象在计算机中的组织方式(逻辑结构、物理存储结构)数据对象必定与一系列加在其上的操作相关联,完成这些操作所用的方法就是算法描述数据结构:抽象数据类型(abstractdatatype)数据类型数据对象集数据集合相关联的操作集抽象(即不具体):描述数据类型......
  • AP5101C 高压线性 LED降压恒流线性IC DFN2*2 省空间车灯驱动
    产品描述AP5101C是一款高压线性LED恒流芯片,外围简单、内置功率管,适用于6-100V输入的高精度降压LED恒流驱动芯片。最大电流2.0A。AP5101C可实现内置MOS做2.0A,外置MOS可做3.0A的。AP5101C内置温度保护功能,温度保护点为130度,温度达到130度时,输......
  • 【数据结构】C语言实现二叉树的相关操作
    树定义树(Tree)是n(n>=0)个结点的有限集若n==0,称为空树若n>0,则它满足如下两个条件:有且仅有一个特定的称为根(Root)的结点其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3,...Tm,其中每一个集合本身又是一棵树,称为根的子树(SubTree)术语结点:数据元素结点的度:结点......
  • NanoFramework操作ESP32(一)_基础元器件篇(四十一)_ 线性霍尔传感器
    一、元器件介绍    触摸感应头即可激活电路。1、针脚用途编号名称功能1AO模拟量输出2G电源地3+电源正4DO开关量输出,检测到磁性时输出高电压,低于阀值时输出低电平二、示例代码1、代码:元器件的针脚ESP32模块的针脚......
  • 数据结构(严)—绪论
    首先,在写这篇博客之前,需要记录一下为什么要写哈哈。现在是24/2/16距离我成为北京大学的硕士还有312天,所以这篇数据结构的笔记,也是为了我的408考研。当然,学习数据结构当然不限于只拿个卷面高分,更重要的是算法Algorithm.1.1研究内容  1.数据之间各种逻辑结构和物理结构,以及他们......
  • 洛谷 【数据结构1-1】线性表
    P3156【深基15.例1】询问学号-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintINF=0x3f3f3f3f;intn,m;map<int,int>mp;signedmain(){ios::sync_with_stdio(false);cin.tie(0);c......
  • dsa线性k攻击
    fromCrypto.Util.numberimport*a=24601959430759983424400804734518943158892550216065342062971649989571838687333b=17474742587088593627q=1115861146902610160756777713087325311747309309771(h1,r1,s1)=535874494834828755542711401117152397489711233142,......
  • Python数据结构与算法05——插入排序 shell排序
    插入排序 definsrt_sort(aimlist):n=len(aimlist)forcurinrange(1,n):i=curwhilei>0:ifaimlist[i]<aimlist[i-1]:aimlist[i],aimlist[i-1]=aimlist[i-1],aimlist[i]i-=1e......
  • 【深度学习】TensorFlow实现线性回归,代码演示。全md文档笔记(代码文档已分享)
    本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实现简单的神经网络结构,在应用上熟练掌握TensorFlow框架使用,掌握神经网络图像相关案例。具体......