数据结构——第四章串、数组和广义表1-6习题

第四章、串、数组和广义表算法设计题1-6

        1.写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。

        1.算法描述【算法设计题】

//1.统计输入字符串中数字字符和字母字符的个数
void Count()
{
	for(i=0;i<36;i++) num[i]=0;//初始化
	while((ch=getchar())!='\0')
		if('0'<=ch<='9')
		{
			i=ch-48;
			num[i]++;
		}
		else if('A'<=ch<='Z')
		{
			i=ch-65+10;
			num[i]++;
		}	
	for(i=0;i<10;i++)
		cout<<"数字"<<i<<"的个数="<<num[i]<<endl; 
	for(i=0;i<36;i++)
		cout<<"字母字符"<<char(i+55)<<"的个数="<<num[i]<<endl; 
} 

        2.写一个递归算法来实现字符串逆序存储,要求不另设串存储空间。

        2.算法描述【算法设计题】

//2.递归实现字符串的逆序存储
void Inverse(char A[])
{
	stastic int i=0;
	cin>>ch;
	while(ch!='.')
	{
		Inverse(A);
		A[i]++=ch;
	}
	A[i]='\0';
}

        3.编写算法,实现下面函数的功能,函数void insert(char*s,char*t,int pos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数)。

        3.算法描述【算法设计题】

//3.将字符串t插入到字符串s中,插入位置为pos 
void Insert(char*s,char*t,int pos)
{
	p=s;q=t;//p、q分别为字符串s和t的工作指针
	if(pos<1)
	{
		cout<<"pos参数位置非法"<<endl;
		exit(0);
	} 
	while(*p!='\0'&&i<pos)//查找pos的位置,找到时i=pos 
	{
		p++;
		i++;
	}
	if(*p=='\0')//pos的位置大于字符串s的长度 
	{
		cout<<pos<<"位置大于字符串s的长度";
		exit(0); 
	}
	else
		while(*p!='\0')
		{
			p++;
			i++;
		}
	while(*q!='\0')
	{
		q++;
		x++;
	}
	for(j=i;j>=pos;j--)
	{
		*(p+x)=*p;
		p--;
	}
	q--;
	p=p+x;
	for(j=1;j<=x;j++)
		*p--=*q--;
} 

        4.已知字符串s1中存放一段英文,设计算法Format(s1,s2,s3,n),将其按照给定的长度n格式化成两端对齐的字符串s2(即长度为n且首尾字符不得为空格字符),其多余的字符送s3。

        4.算法描述【算法设计题】

//4.将s1拆分为s2和s3,要求s2长度为n且两端对齐
void Format(char*s1,*s2,*s3)
{
	p=s1;q=s2;
	while(*p!='\0'&&*p==' ') p++;
	if(*p=='\0')
	{
		cout<<"字符串s1为空串或空格串"<<endl;
		exit(0); 
	}
	i=0;
	while(*p!='\0'&&i<n)
	{
		*q=*p;q++;p++;i++;
	}
	p--;
	q--;
	if(*p=='\0')
	{
		cout<<"字符串s1没有"<<n<<"个有效字符"<<endl;
		exit(0); 
	}
	if(*q==' ')
	{
		while(*p==' '&&*p!='\0')
			p++;
		if(*p=='\0')
		{
			cout<<"字符串s1没有"<<n<<"个两端对齐的字符串"<<endl;
			exit(0);
		}
	*q=*p;
	}
	*(++q)='\0';
	q=s3;
	p++;
	while(*p!='\0')
	{
		*q=*p;
		q++;
		p++;
	}
	*q='\0';
}

        5.设二维数组a[1-m,1-n]含有m*n个整数。(1)写出一个算法判断a中所有元素是否互不相同,输出相关信息(yes/no);(2)试分析算法的时间复杂度。

        5.算法描述【算法设计题】

//5.判断二维数组中a所有元素是否互不相同,如是,返回1;否则,返回0
int IsEqual(int a[m][n],int m,int n)
{
	for(i=0;i<m;i++)
		for(j=0;j<n-1;j++)
		{
			for(p=j+1;p<n;p++)
			if(a[i][j]=a[i][p])
			{
				cout<<"no";
				return 0;
			}
			for(k=i+1;k<m;k++)
				for(p=0;p<n;p++)
					if(a[i][j]==a[k][p])
					{
						cout<<"no";
						return 0;
					}
		}
		cout<<"yes";
		return 1;
}

        6.设任意n个整数存放于数组A(1..n)中,试编写算法,将所有正数排在所有负数前面(要求算法复杂度为0(n))。

        6.算法描述【算法设计题】

//6.数组A中存储n个整数,将A中所有正整数排在所有负数的前面
void Partition(int A[],int n)
{
	while(low<high)
	{
		while(low<high&&A[low]>0)
			low++;
		while(low<high&&A[high]<0)
			high--;
		if(low<high)//交换A[low]和A[high] 
		{
			t=A[low];
			A[low++]=A[high];
			A[high--]=t;
		}
	}	
} 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值