小明最近喜欢上数组统计,但是他遇到了一道难题,题目如下:
最初数列是空的,那么一共有下面五种操作:
a x 表示向数列里面增加数值为x的数;
d x 表示删除数列里面数值为x的数;
I 表示删除数列里面数值最大的数;
m 表示删除数列里面数值最小的数;
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;
}
}
}
如有帮助,请点击我的回答下方的“采纳该答案”帮忙采纳一下,谢谢。
就是定义5个函数
根据读取的操作符调用不同的函数对数组进行操作
建议使用STL实现,避免数据的搬移造成额外运行开销,需要我给你实现吗?
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!