计蒜客课程数据结构(顺序表)

1.线性表是由相同数据类型的 n 个数据元素a0,a1,......,an-1 组成的有限序列。一个数据元素可以由若干个数据项组成。若用 L 命名线性表,则其一般表示如下:

L=(a0,a1,......,an-1)

其中, a0?? 是唯一的“第一个”数据元素,又称为表头元素;an-1?? 是唯一的“最后一个”数据元素,又称为表尾元素。

线性表按照存储结构,可以分为顺序表和链表两种类型。

2.顺序表是在计算机内存中以数组形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。

线性表中元素具有逻辑上的顺序性。

线性表中所有元素的数据类型都是相同的。

线性表中的元素个数是有限的。

3.顺序表最主要的特点是可以进行 随机访问,即可以通过表头元素的地址和元素的编号(下标),在 O(1)O(1) 的时间复杂度内找到指定的元素。

顺序表的不足之处是插入和删除操作需要移动大量的元素,从而保持逻辑上和物理上的连续性。

4.顺序表的构造,插入,扩容,删除,遍历

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 class Vector {
 5 private:
 6     int size, length;                //顺序表当前的最大容量和当前顺序表中的元素个数
 7     int *data;                       //动态分配,指向存储元素的数组的指针
 8 public:
 9     Vector(int input_size) {         //构造函数,构造一个容量为input_size的顺序表
10         size = input_size;
11         length = 0;
12         data = new int[size];        //让data指向一段连续size个int空间
13     }
14     ~Vector() {                     //析构函数
15         delete[] data;              //将data指向的空间回收
16     }
17     bool insert(int loc, int value) {//顺序表的插入
18         if (loc < 0 || loc > length) {//判断插入的位置是否合法
19             return false;
20         }
21         if (length >= size) {           //判断容量是否已经达到上限
22             return false;               //这句可注释掉并调用扩容操作
23         }
24         for (int i = length; i > loc; --i) { //loc位置后元素后移
25             data[i] = data[i - 1];
26         }
27         data[loc] = value;
28         length++;
29         return true;
30     }
31     void expand(){                      //顺序表的扩容
32         int *old_data=data;
33         size=size*2;
34         data=new int[size];
35         for(int i=0;i<length;i++){
36             data[i]=old_data[i];
37         }
38         delete[]old_data;
39     }
40     int search(int value) {                 //顺序表的查找
41         for (int i = 0; i < length; ++i) {
42             if (data[i] == value) {
43                 return i;
44             }
45         }
46         return -1;
47     }
48     bool remove(int index) {               //顺序表的删除
49         if (index < 0 || index >= length) {
50             return false;
51         }
52         for (int i = index + 1; i < length; ++i) {
53             data[i - 1] = data[i];
54         }
55         length = length - 1;
56         return true;
57     }
58     void print() {                            //顺序表的遍历
59         for(int i=0;i<length;i++){
60             if(i>0){
61                 cout<<" ";
62             }
63             cout<<data[i];
64         }
65         cout<<endl;
66     }
67 };
68 int main() {
69     Vector a(2);
70     cout << a.insert(0, 1) << endl;
71     cout << a.insert(0, 2) << endl;
72     a.print();
73     cout << a.remove(1) << endl;
74     a.print();
75     cout << a.search(0) << endl;
76     cout << a.search(1) << endl;
77     return 0;
78 }
时间: 2024-08-08 01:28:22

计蒜客课程数据结构(顺序表)的相关文章

计蒜客课程数据结构(链表)

1.链表是一种与火车非常相似的数据结构,在链表里,我们叫火车头为表头,每节车厢就是链表的元素,车厢里载的人和物就是元素的数据域,连接车厢的部件就是元素的指针.从火车的结构我们可以发现链表的一个特点,元素之间前后依赖,串联而成. 2.性质: 元素相互依赖,串联而成(除了火车头,每节车厢都只链接到前一节车厢) 链表只有一个表头(火车只有一个火车头) 元素不能随机访问(不能随机到达某节车厢) 3.链表的创建,插入,遍历,删除和翻转 1 #include<iostream> 2 using names

计蒜客课程竞赛入门--统计三角形 代码流程摘记

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int n,l[15];//n:木棍数量,l数组:每根木棍长度 6 bool h[10000]; 7 /* 8 因为三条边长度是确定的,所以确定两条边就可以,且,这个数组是用哈希表来储存 9 储存方式为第一条边长度*100+第二条边长度,最高位99*100+99=9999,故存10000 10 */ 1

计蒜客 课程学分总数

题目链接  课程学分总数 很基础的树型DP.注意输入数据可能是森林而不是完整的一棵树. 那么给所有没有祖先的点加一个公共的根就好了. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const

计蒜客课程竞赛入门--堆排序 流程记

堆实际上是一颗二叉树,对于大根堆来说,它的特点就是父节点的值大于所有子节点的值. C++的STL中priority_queue已经帮我们实现好了堆的数据结构,接下来我们一起学习并实践如何实现一个堆并用堆进行排序. priority_queue是STL的queue这个头文件中定义的数据结构,因此需要额外引用它,即#include <queue>. 1 #include <iostream> 2 #include <cstdio> 3 #include <queue&

计蒜客课程竞赛入门--二叉搜索树 流程记

二叉搜索树插入删除演示地址: http://www.cs.usfca.edu/~galles/visualization/BST.html 细心的你应该发现了,二叉搜索树的每个节点都要比左边的子孙节点的值要大,比右边的要小.二叉搜索树的中序遍历就是将整棵树按从小到大的顺序输出.是不是很神奇^o^ 如何在二叉搜索树中查找某个元素呢?首先从根出发,如果和根的值相等,则返回根,否则如果比根小就去左孩子,如果比根大就去右孩子,依次递归进行,直到找到值或者找不到返回空. 那么插入操作呢?紧接着上面的查找算

计蒜客课程竞赛入门--冗余关系(并查集) 流程记

蒜头最近在沉迷小说,尤其是人物关系复杂的言情小说.它看到的人物关系描述得很的麻烦的时候觉得非常蒜疼,尤其是人物关系里有冗余的时候.什么是冗余关系呢? 这篇小说里有n句描述人物关系的句子,描述了n个人的关系. 每条句子的定义是这样的: X<->Y    它的意思是:X认识Y,Y也认识X 我们认为小说中的人物关系是具有传递性的,假如A认识B,B认识C,则A也认识C. 冗余关系的定义:就是即使没有这条人物关系,原来的人物之间的所有关系也照样成立. 比如: 小说中已经提到了A认识B,B也认识C.在此之

计蒜客课程竞赛入门--最近通话记录(STL队列) 流程记

蒜头君前几天把最心爱的小麦手机摔坏了,新手机又要好几天才能到货,于是蒜头君不得暂时用它珍藏已久的诺鸡鸭非智能手机了.手机的存储空间非常小,以至于未接来电.已接来电和已拨电话都只能各自保存最近的10条记录. 蒜头买了手机以后的未接来电.已接来电和已拨电话记录全部给出.机智的蒜头能够猜到这个手机使用了循环队列来实现最近记录的功能,不过它不会写代码(没手怎么写π_π),于是它来求助正在算法课程中过关斩将的你了.你能帮帮它吗? 输入格式: 每条记录包含两个数字,第一个数代表记录类型,第二个数代表手机号码

计蒜客课程竞赛入门--最长上升子序列(LIS) 流程记

最长上升子序列 (Longest Increasing Subsequence, 常简称为 LIS) 是动态规划解决的一个经典问题. 我们先讲一下子序列是什么.一个数组的子序列就是从里面选出一些元素,并将他们保持原有的先后顺序排列.比如[1, 2, 3, 4, 5]的子序列有[1, 3, 5].[3, 4],而[1, 5, 3]则不是这个数组的子序列. 这里多介绍一下,还有一个容易与子序列混淆的概念:子串.子串是指从一个数组中选出连续的一个或多个元素,并且保持他们原有的顺序.子串一定是子序列,比

计蒜客课程竞赛入门--蒜头学算数 流程记

蒜头的数学实在是太差了,于是老师把他关到小黑屋让他闭门修炼.老师跟他一张纸,上面一 排写着1, 2, 3...N这N个数,中间用空白分隔.老师让他在空白处填上加号或者减号.他让蒜头君求出一共有多少种加运算符的方法使得整个表达式的值为0,并输出所有 的方案.比如N=7时,1 2 3 4 5 6 7排成一排,一种插入符号的方案为1+2-3+4-5-6+7=0.是不是很有趣,快来帮蒜头君解出这题吧(*´▽`)?? 输入为一行,包含一个整数N(3≤N≤9). 输出为所有在每对数字间插入“+”或“-”后能