步步为营,蚕食数据结构与算法---数组篇
Posted cuckoonuts
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了步步为营,蚕食数据结构与算法---数组篇相关的知识,希望对你有一定的参考价值。
数组是最基础的数据结构之一,也是很多高级数据结构的基础。
我们简单复习一下数组的创建与遍历,先做一下热身,后面逐渐一步步实现自己的数组
我们的开发环境主要是JDK1.8,c++11编辑工具是 jetbrains的强大开发工具 IteliJ(java),Clion(c++)
Java版:
1 public class Main { 2 public static void main(String[] args){ 3 int [] arr = new int[10];//init a new array with asigned prams 4 for(int i = 0 ;i < arr.length ; i++){ 5 6 arr[i] = i ; 7 System.out.println(arr[i]);} 8 System.out.println("*****************************"); 9 int scores[] = new int[]{23,44,54};//please be noted diffrent ways of creating a new array and diffrent ways to iterate array 10 11 for( int i = 0 ; i < scores.length ; i ++) 12 System.out.println(scores[i]); 13 System.out.println("*****************************"); 14 for(int score : scores) 15 System.out.println(score); 16 System.out.println("*****************************"); 17 scores[0] = 88 ; 18 for( int i = 0 ; i< scores.length ; i ++) 19 System.out.println(scores[i]); 20 21 }
C++版:
#include <iostream> int main() { int arr[10]; for(int i = 0 ; i < 10 ; i++){ arr[i] = i; std::cout << arr[i] <<" "; } std::cout << std::endl; int scores[] = {23,34,45}; for(int i = 0; i < sizeof(scores)/ sizeof(int) ; i++){ std::cout << scores[i] <<" "; } std::cout<<std::endl; scores[0] = 88; for(int i = 0 ;i < sizeof(scores)/ sizeof(int); i++){ std::cout << scores[i] << " "; } std::cout << std::endl; return 0; }
首先我们创造自己的数组,在Java中,要创建自己的Array类,
Java版:
1 public class Array { 2 private int[] data; 3 private int size; 4 //constructor ,create Array with the input param "capacity" 5 public Array(int capacity){ 6 data = new int[capacity]; 7 size = 0; 8 } 9 //constructor without params,our default capacity is 10 10 public Array(){ 11 this(10); 12 } 13 //get the capacity of this array 14 public int getCapacity(){ 15 return data.length; 16 } 17 //get the amount of elements of this array 18 public int getSize(){ 19 return size; 20 } 21 //judge whether this array is empty or not 22 public boolean isEmpty(){ 23 return size==0; 24 } 25 }
C++版:
1 class Array { 2 private: 3 int *data; 4 int size; 5 int capacity; 6 7 public: 8 Array(int capacity){ 9 data = new int[capacity]; 10 size = 0 ; 11 this->capacity = capacity; 12 } 13 Array(){ 14 data = new int[10]; 15 size = 0 ; 16 capacity = 10; 17 18 } 19 int getCapcity(){ 20 return capacity; 21 } 22 int getSize(){ 23 return size; 24 25 } 26 bool isEmpty(){ 27 return size == 0; 28 } 29 30 };
上面的Array类并不完善,我们将对其进行改进和提升
以Java为例:我们向Array中所有元素 后面添加一个元素,则有代码:
1 public void addLast(int e){ 2 //judge whether can we add a new element 3 if(size == data.length){ 4 throw new IllegalArgumentException("AddLust failed,the array is full"); 5 } 6 //asign the new last element 7 data[size] = e ; 8 //maintain the size of the array 9 size ++ ; 10 }
继续我们创建为索引位置的插入一个元素的方法:
在插入元素时的逻辑如下:插入位置前面的元素不变,插入位置及其插入位置以后的元素均后移一位,空出的位置(也就是插入位置)插入新元素,在插入时我们采用从数组尾端开始移动,这是这段代码的巧妙所在
这时我们观察新加入的两个方法,似乎有重复,可以因为第二个方法明显包含了第一种方法,因此我们可以对代码进行优化,直接将第一种方法优化:
public void addLast(int e){ add(size,e); }
同理我们也可以添加新的方法,在所有元素前面添加一个新元素:
public void addFirst(int e){ add(0,e); }
获取索引位置的元素:
以上是关于步步为营,蚕食数据结构与算法---数组篇的主要内容,如果未能解决你的问题,请参考以下文章