C++数据结构--01数组二次封装成动态数组 2021-04-23

简介: C++数据结构--01数组二次封装成动态数组 2021-04-23
//C++数据结构--01数组二次封装成动态数组
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <sstream>
using namespace std;
template<typename T>
class Array
{
private:
  T* data;
  int capacity;
  int size;
public:
  //无参构造函数,采用模板设置 
  Array():Array(5){}
  //构造函数,传入数组的容量 capacity 构造 Array
  Array(int capacity){
    data=new T[capacity];size=0;this->capacity=capacity;
  }
  //获取数组中的元素个数
  int getsize() { return size; } 
  //获取数组容量
  int getCapacity() { return capacity; }
  //返回数组是否为空
   bool isEmpty() { return size==0; } 
   //向所有元素后添加一个新元素
   void addLast(T e){
    add(size,e);
   }
   //在所有元素前添加一个新元素
   void addFirst(T e){
    add(0,e);
   }
   //在第indx个位置上插入一个新元素e
   void add(int index,T e) {
    if(size == capacity) resize(2*capacity);//扩容 
    if(index<0 || index>size)
      throw "Add failed.Require index>=0 and index<=size.";
    for(int i=size-1;i>=index;i--)
      *(data+i+1) = *(data+i); 
    *(data+index)=e;
    size++;
   }
   //获取index索引位置的元素
   T get(int index){
    if(index<0 || index>=size)
      throw "Add failed. Index is illegal.";
    return *(data+index);
   }
   //修改index索引位置的元素
   void set(int index,T e){
    if(index<0 || index>=size)
      throw "Add failed. Index is illegal.";
    *(data+index)=e;
   } 
   //查找数组中是否有元素e
   bool contains(T e){
    for(int i=0;i<size;i++)
      if(*(data+i)==e) return true;
    return false;
   } 
   //查找数组元素第一个e所在的索引,如果不存在e,则返回-1 
   int find(int e){
    for(int i=0;i<size;i++)
      if(*(data+i)==e) return i;
    return -1;
   }
   //从数组中删除index位置的元素,返回删除的元素
   T remove(int index){
    if(index<0 || index>=size)
      throw "Add failed. Index is illegal.";
    T ret=*(data+index);
    for(int i=index+1;i<size;i++)
      *(data+i-1)=*(data+i);
    size--;
    if(size==capacity/4 && capacity/2!=0) resize(capacity/2);//缩容 
    return ret;
   }
   //从数组中删除第一个元素,返回删除的元素
   T removeFirst() { remove(0); } 
   //从数组中删除最后一个元素,返回删除的元素
   T removeLast() { remove(size-1); } 
   //从数组中删除第一个元素e, 没找到返回false 
   bool removeElement(T e){
    int index=find(e);
    if(index) { return remove(index);}
    else return false;
   }
   //重载[] 
     T& operator [](int index) { return data[index]; }  
   //输出所有数组元素 
   void print(){
    for(int i=0;i<size;i++)
      if(i==0)cout<<"{"<<*(data+i)<<",";
      else if(i==size-1)cout<<*(data+i)<<"}"<<endl;
      else cout<<*(data+i)<<",";
   }
private:
  //动态调整数组大小
  void resize(int newCapacity){ 
    T* newData = new T[newCapacity];
    for(int i=0;i<size;i++)
      *(newData+i)=*(data+i);
    data=newData;
    capacity=newCapacity;
  }
};
class Student{
private:
  string name;
  int score;
public:
  Student(string name,int score){
    this->name=name;
    this->score=score;
  }
  Student(){}
public:
  void print(){
    printf("Student(name:%s ,score: %d)\n",name.c_str(),score);
  }
  //友元函数重载<< 
  friend ostream& operator <<(ostream &os,const Student &s);
};
//重载<<
ostream& operator <<(ostream &os,const Student &s)
{
  os<<"Student(name:"<<s.name<<" ,score: "<<s.score<<")";
  return os;
} 
//重载 &&
string operator &(const string &s,const int n)
{
  int t=n;
  string ss;
  while(t>0){
    ss.insert(ss.begin(),t%10+'0');
    t/=10;
  }
  return s+ss;
} 
//重载 +
string operator +(const string &s,int n)
{
  stringstream ss;
  ss<<n;
  return s+ss.str();
}
void testArry(){
  Array<int>  aa; 
  for(int i=0;i<10;i++)
    aa.addLast(i);
  aa.print();
  cout<<aa.get(1)<<endl;
  aa.add(5,88);
  aa.set(1,22);
  aa.print();
  cout<<"getsize():"<<aa.getsize()<<endl;
  cout<<"getCapacity():"<<aa.getCapacity()<<endl;
  cout<<aa.contains(5)<<endl;
  cout<<aa.find(8)<<endl;
  aa.print();
  cout<<aa.remove(7)<<endl;
  aa.print();
  cout<<aa.removeFirst()<<" "<<aa.removeLast()<<endl;
  aa.print();
  cout<<aa.removeElement(7)<<endl;
  aa.print();
  cout<<"getsize():"<<aa.getsize()<<endl;
  cout<<"getCapacity():"<<aa.getCapacity()<<endl;
  cout<<"isEmpty():"<<aa.isEmpty()<<endl;
}
int main(int argc, char *argv[])
{
  try { testArry();}
  catch(const char* error){ cout<<error<<endl; }
/*
  Student student("Lucy",85);
  student.print();
  Array<Student> arr;
  arr.addLast(Student("Lily",93));
  arr.addLast(Student("Maik",89));
  arr.addLast(Student("Jac",77));
  for(int i=0;i<arr.getsize();i++)
    cout<<arr[i]<<" ";cout<<endl;
  string ss="AAA";
  cout<<(ss+"123")<<endl;
  cout<<(ss&678910456)<<endl;
  cout<<(ss+678910456)<<endl;
   */
  return 0;
}
相关文章
|
16天前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
58 23
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77
|
1月前
|
存储 人工智能 算法
【C++数据结构——图】最短路径(头歌教学实验平台习题) 【合集】
任务描述 本关任务:编写一个程序,利用Dijkstra算法,实现带权有向图的最短路径。 相关知识 为了完成本关任务,你需要掌握:Dijkst本关任务:编写一个程序,利用Dijkstra算法,实现带权有向图的最短路径。为了完成本关任务,你需要掌握:Dijkstra算法。带权有向图:该图对应的二维数组如下所示:Dijkstra算法:Dijkstra算法是指给定一个带权有向图G与源点v,求从v到G中其他顶点的最短路径。Dijkstra算法的具体步骤如下:(1)初始时,S只包含源点,即S={v},v的距离为0。
61 15
|
1月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
46 10
|
1月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
61 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
1月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
48 12
|
1月前
|
算法 C++
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
【数据结构——图】最小生成树(头歌实践教学平台习题)目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:【合集】任务描述 本关任务:编写一个程序求图的最小生成树。相关知识 为了完成本关任务,你需要掌握:1.建立邻接矩阵,2.Prim算法。建立邻接矩阵 上述带权无向图对应的二维数组,根据它建立邻接矩阵,如图1建立下列邻接矩阵。注意:INF表示无穷大,表示整数:32767 intA[MAXV][MAXV];Prim算法 普里姆(Prim)算法是一种构造性算法,从候选边中挑
44 10
|
1月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
49 10
|
1月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
38 7
|
1月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
44 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】