3658小明统计数组

小明最近喜欢上数组统计,但是他遇到了一道难题,题目如下:

最初数列是空的,那么一共有下面五种操作:

  1. a x 表示向数列里面增加数值为x的数;

  2. d x 表示删除数列里面数值为x的数;

  3. I 表示删除数列里面数值最大的数;

  4. m 表示删除数列里面数值最小的数;

  5. q 询问当前数列的和。

保证添加的元素都不不一样,对于删除操作,如果数列里面不存在这个元素,则不进行删除操作。小明不会做这个题,希望寻求你的帮助,聪明的你可以帮助小明解决这个问题吗?

在处理输入的时候要特别注意!题目中操作 3 的操作字符是 大写的 i,而不是小写的 l。
输入格式
第一行输入两个数n,表示操作的数目; 之后n行,每行为题目中描述的五种操作。
输出格式
对于每个询问,输出当前数列的和。

用数组作为数列,然后进行插入、删除、求和的操作就可以了。删除的时候是删除所有值为x的数吗?还是只删除最前面的?两种方式都写了函数,根据你自己的需要调用即可。代码如下:

#include <iostream>
using namespace std;

//插入数据
void insert(double a[],int &n,double x)
{
    a[n] = x;
    n++;
}
//删除数为x的值,删除第一个x
void del_1(double a[],int &n,double x)
{
    int i,j;
    for (i=0;i<n;i++)
    {
        if(a[i]==x)
        {
            for (j = i;j<n-1;j++)
            {
                a[j] = a[j+1];
            }
            n--;
            break;
        }
    }
}

//删除数为x的值,删除所有x
void del_2(double a[],int &n,double x)
{
    int i,j;
    for (i=0;i<n;i++)
    {
        if(a[i]==x)
        {
            for (j = i;j<n-1;j++)
            {
                a[j] = a[j+1];
            }
            n--;
            i--;
        }
    }
}

//删除最大的数
void delmax(double a[],int &n)
{
    int index=0;
    for (int i = 1;i<n;i++)
    {
        if(a[i]>a[index])
            index = i;
    }
    //删除index位置的数
    for (int i=index;i<n-1;i++)
    {
        a[i] = a[i+1];
    }
    n--;
}

//删除最小的数
void delmin(double a[],int &n)
{
    int index=0;
    for (int i = 1;i<n;i++)
    {
        if(a[i]<a[index])
            index = i;
    }
    //删除index位置的数
    for (int i=index;i<n-1;i++)
    {
        a[i] = a[i+1];
    }
    n--;
}

//求和
double sum(double a[],int n)
{
    int s=0;
    for (int i=0;i<n;i++)
    {
        s+= a[i];
    }
    return s;
}

int main()
{
    char op;
    int nmb = 0;
    double a[1000],x,max,min; //存储数据
    int n,i;
    cin >> n;
    getchar();
    for (i=0;i<n;i++)
    {
        cin >> op;
        switch(op)
        {
        case 'a':
            cin >> x;
            getchar();//接收回车符
            insert(a,nmb,x);
            break;
        case 'd':
            cin >> x;
            getchar();//接收回车符
            del_1(a,nmb,x); //删除第一个x,根据你的需要决定用哪一个
            //del_2(a,nmb,x); //删除所有x
            break;
        case 'I':
            delmax(a,nmb);//删除最大值
            break;
        case 'm':
            delmin(a,nmb); //删除最小值
            break;
        case 'q':
            cout << sum(a,nmb)<<endl; //输出和
            break;
        }
    }
}

如有帮助,请点击我的回答下方的“采纳该答案”帮忙采纳一下,谢谢。

img

就是定义5个函数
根据读取的操作符调用不同的函数对数组进行操作

建议使用STL实现,避免数据的搬移造成额外运行开销,需要我给你实现吗?

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632