数据结构作业之数组

/*
    编程作业
    2.1 向highArray.java程序(清单2.3)的HighArray类添加一个名为getMax()的方法,它返回
        数组中最大关键字的值,当数组为空时返回-1。向main()中添加一些代码来使用这个方法。
        可以假设所有关键字都是正数。
    2.2 修改编程作业2.1中的方法,使之不仅返回最大的关键字,而且还将该关键字从数组中删除。
        将这个方法命名为removeMax()。
    2.3 编程作业2.2中的removeMax()方法提供了一种通过关键字值进行数组排序的方法。实现一个
        排序方案,要求不修改HighArray类,只需对main()中的代码进行修改。这个方法需要第二个
        数组,在排序结束时数组数据项是逆序排列的。(这个方法是第3章“简单排序”中选择排序的
        一个变体。)
    2.4 修改orderedArray.java程序(清单2.4)使insert()、delete()与find()方法一样都使用
        二分查找,正如书中所建议的那样。
    2.5 向orderedArray.java程序(清单2.4)的OrdArray类加入一个merge()方法,使之可以将两个
        有序的源数组合并成一个有序的目的数组。在main()中添加代码,向两个源数组中插入随机数,
        调用merge()方法,并将结果目的数组显示出来。两个源数组的数据项个数可能不同。在算法中
        需要先比较源数组中的关键字,从中选出最小的一个数据项复制到目的数组。同时还要考虑如何
        解决当一个源数组的数据项已经取完而另一个还剩一些数据项情况。
    2.6 向highArray.java程序(清单2.3)的HighArray类中加入一个noDup()方法,使之可以将数组中
        的所有重复数据项删除。即如果数组中有三个数据项的关键字为17,noDup()方法会删除其中的
        两个。不必考虑保持数据项的顺序。一种方法是先用每一个数据项同其他数据项比较,并用null
        (或是一个不会用在真正的关键字中的特殊值)将重复的数据项覆盖掉。然后将所有的null删除,
        当然还要缩小数组的大小。
 */  
package 数据结构作业;

public class HighArray {

    private long [] a;
    private int nElems;
    public HighArray(int max)
    {
        a = new long[max];
        nElems = 0;
    }
    //查找的方法的实现
    public boolean find(long searchKey)
    {
        int j;
        for(j=0;j<nElems;j++)
        {
            if(a[j] == searchKey)
            {
                break;
            }

        }
        if(j == nElems)
        {
            return false;
        }else{
            return true;
        }
    }

    //插入元素的实现
    public void insert(long value)
    {
        a[nElems] = value;
        nElems++;
    }

    //删除元素的实现
    public boolean delete(long value)
    {
        int j;
        for(j=0;j<nElems;j++)
        {
            if(value == a[j])
            {
                break;
            }
        }
        if(j == nElems)
        {
            return false;
        }else{
            for(int k = j;k<nElems;k++)
            {
                a[k] = a[k+1];//// 这里不是多移了一次 当k=nElems-1时, a[nElems-1] = a[nElems]; 此时a[nElems]为空  

            }
            nElems--;
            return true;
        }

    }

    public void display()
    {
        for (int j = 0; j < nElems; j++)
            // for each element,
            System.out.print(a[j] + " "); // display it
        System.out.println("");
    }

    //作业2.1
    public long getMax()
    {
        long max = -1;//最大元素的值
        for(int j=0;j<nElems;j++)
        {
            if(a[j] > max)
            {
                max = a[j];
            }
        }
        return max;

    }

    //作业2.2
    public long removeMax()
    {
        long max = -1;//最大元素的值
        int index = -1;//最大元素的索引号
        for(int j=0;j<nElems;j++)
        {
            if(a[j] > max)
            {
                max = a[j];
                index = j;
            }
        }

        if(index != -1)//找到最大元素的值
        {
            for(int i = index+1;i<nElems;i++)
            {
                a[i-1] = a[i];
            }
            nElems--;
        }

        return max;

    }

    /**
     * 向highArray.java程序(清单2.3)的HighArray类中加入一个noDup()方法,使之可以将数组中
        的所有重复数据项删除。即如果数组中有三个数据项的关键字为17,noDup()方法会删除其中的
        两个。不必考虑保持数据项的顺序。一种方法是先用每一个数据项同其他数据项比较,并用null
        (或是一个不会用在真正的关键字中的特殊值)将重复的数据项覆盖掉。然后将所有的null删除,
        当然还要缩小数组的大小。
     */

    public void noDup()
    {
        int NULL = -1;//用-1作为一个特殊值
        for(int j=0;j<nElems;j++)
        {
            for(int i=j+1;i<nElems;i++)
            {
                if(a[j] != NULL && a[j] == a[i])
                {
                    a[i] = NULL;
                }
            }
        }

        for(int i=0;i<nElems;)
        {
            if(a[i] == NULL)//注意移动完成之后不要i++,再次检查当前位置是不是NULL
            {
                for(int j = i+1;j<nElems;j++)
                {
                    a[j-1] = a[j];
                }
                nElems--;
            }else{
                i++;//不是NULL,就直接i++.
            }
        }

    }

}
---------------------------------------------------------------------------------package 数据结构作业;

/**
 * 向highArray数组中添加一个名为getMax的方法
 * 它返回的是最大的关键字的值
 * @author Administrator
 *
 */
public class demo2 {

    public static void main(String[] args) {
        int maxSize = 100;
        HighArray arr = new HighArray(maxSize);
         arr.insert(77); // insert 10 items
            arr.insert(99);
            arr.insert(44);
            arr.insert(55);
            arr.insert(22);
            arr.insert(88);
            arr.insert(11);
            arr.insert(00);
            arr.insert(66);
            arr.insert(33);  

            arr.display(); // display items  

            int searchKey = 35; // search for item
            if (arr.find(searchKey))
                System.out.println("Found " + searchKey);
            else
                System.out.println("Can‘t find " + searchKey);  

            arr.delete(00); // delete 3 items
            arr.delete(55);
            arr.delete(99);  

            arr.display(); // display items again  

            // =======================================================
            //  编程作业2.1
            long max = arr.getMax();
            System.out.println("Found max is " + max);
            // =======================================================
            //  编程作业2.2
            arr.removeMax();
            arr.display();
            // =======================================================
            //  编程作业2.3
            HighArray sortedArr = new HighArray(maxSize);
            int i = 0;
            max = arr.removeMax();
            while (max != -1) {
                sortedArr.insert(max);
                max = arr.removeMax();
            }
            System.out.println("逆序排列:");
            sortedArr.display();
            // =======================================================
            arr.insert(77); // insert 10 items
            arr.insert(99);
            arr.insert(44);
            arr.insert(55);
            arr.insert(22);
            // 重复值
            arr.insert(44);
            arr.insert(77);
            arr.insert(44);
            arr.insert(66);  

            arr.insert(88);
            arr.insert(11);
            arr.insert(00);
            arr.insert(66);
            arr.insert(33);  

            System.out.println("加入重复值后:");
            arr.display();
            // arr.noDup();
            arr.noDup();
            System.out.println("去掉重复值后:");
            arr.display();
            // =======================================================  

    }

}
时间: 2024-10-13 06:28:34

数据结构作业之数组的相关文章

SDUT 3347 数据结构实验之数组三:快速转置

数据结构实验之数组三:快速转置 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 转置运算是一种最简单的矩阵运算,对于一个m*n的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它的转置矩阵T是一个n*m的矩阵,且T( i , j )=M( j , i ).显然,一个稀疏矩阵的转置仍然是稀疏矩阵.你的任务是对给定一个m*n的稀疏矩阵( m

(2)redis的基本数据结构是动态数组

redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势: 1.不需要初始化,数组名直接就是所在的偏移   2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间.  这个数组不占用任何内存,意味着这样的结构节省空间: 该数组的内存地址就和他后面的元素的地址相同,意味着无需初始化,数组名就是后面元素的地

【算法与数据结构】图 -- 数组表示法

图的数组表示法 借助一个二维数组表示图,该二维数组的第i行,第j列的值表示从Node[i]到Node[j]: 无向图(网):是否有边 / 权值,arr[i][j] == arr[j][i],无向图(网)的特性,矩阵关于对角线对称. 有向图(网):是否有弧 / 权值. //图的数组表示法 //最大顶点个数 const int MAX_VERTEX = 100; //最大值 const int MAX_VALUE = (1 << 31) - 1; typedef struct _tagArcCel

当数据结构遇到编程语言——数组

赵振江 数据结构 数组 一维数组 "数组"你真的很了解吗? 数组大家都不是很陌生,它已经"植入"了许多编程语言,但初学者一提到数组,可能不会联想到"数据结构",而是想到的会是一种"数据类型",数组本质上就是一种极其简单的数据结构.所谓数组,就是相同数据类型的元素按一定顺序排列的集合.也就是在内存中划分一段连续的且大小固定(注意是连续)的内存空间(或者其他存储器)保存相同数据类型的数据,如下图.一般说的简单数组,都是静态的数组,

java程序代码代写、代写tree数据结构作业

java程序代码代写.代写tree数据结构作业实验三:java面向对象编程一.实验目的及要求1.理解 Java 语言是如何体现面向对象编程基本思想的:2.掌握类的声明以及对象的创建:3.了解类的成员变量和成员方法的特性以及类的构造方法的使用. 4.掌握类变量与实例变量以及类方法和实例方法的区别.二.实验内容1. 编写程序模拟两个村庄共同拥有一片森林.编写一个Village类,该类有一个静态的int型成员变量treeAmount用于模拟森林中树木的数量.在主类MainClass的方法中创建两个村庄

JAVA 图作业算法实现、代写Graphs 数据结构作业

JAVA 图作业算法实现.代写Graphs 数据结构作业Lab Case – Algorithms and Data Structure, 2017-2018Phase 3. GraphsCurrently, SharingCar only provides service in ten cities (Madrid, Barcelona, Valencia, Sevilla, Bilbao, Granada, Toledo, Salamanca, Alicante, Cáceres). Not

数据结构——树状数组

我们今天来讲一个应用比较广泛的数据结构——树状数组 它可以在O(nlogn)的复杂度下进行单点修改区间查询,下面我会分成三个模块对树状数组进行详细的解说,分别是树状数组基本操作.树状数组区间修改单点查询的实现.树状数组查询最值的实现 一. 树状数组一般分为三种操作,初始化.修改.查询 在讲基本操作之前,我们先来看一张图 这张图就是树状数组的存储方式,对于没有接触过树状数组的人来说看懂上面这张图可能有些困难,上图的A数组就是我们的原数组,C数组则是我们需要维护的数组,这样存储能干什么呢,比如我们在

从零开始实现数据结构(一) 动态数组

从零开始实现数据结构(一) 动态数组 动态数组是所有数据结构中最简单的一种,甚至在很多的语言中,数组本身就是可以不定长的.因为在学习c++的时候,使用动态数组的各种操作都不是很方便(数据结构的学习最好还是c或c++,基础打好了其他的语言数据结构就很简单).所以开始学习如何去实现一个像STL中的vector一样的动态数组. 创建数组基类CArray 因为后面还准备写一个有序数组,所以这里使用一个CArray类,把数组的各种基本特性先创建好.后面需要写什么数组,就可以写它下面的子类,来完成特殊的功能

数据结构实践项目——数组和广义表

本文针对 [数据结构基础系列网络课程(5):数组和广义表] 1. 数组的基本概念与存储结构 2. 特殊矩阵的压缩存储 3. 稀疏矩阵的三元组表示 4. 稀疏矩阵的十字链表表示 5. 广义表 6. 广义表的存储结构及基本运算的实现 [项目1 - 猴子选大王(数组版)] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,最后一只出圈的猴子为大王.输入m和n,输出猴子离开圈子的顺序,从中也可以看出最后为大王是几号