数据结构第三章——算法设计题

(1)回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符序列是否为回文。(提示:将一半字符入栈)

#define StackSize 100  //假定预分配的栈空间最多为100个元素
typedef char DataType;  //假定栈元素的数据类型为字符
typedef struct
{
	DataType data[StackSize];
	int top;
}SeqStack;

int IsHuiwen(char *t)
{//判断t字符是否为回文,若是,返回1,否则返回0 
	SeqStack s;
	int i, len;
	char temp;
	InitStack(&s);
	len=strlen(t);  //求向量长度 
	for(i=0;i<len/2;i++)  //将一半字符入栈
		push(&s,t[i]);
	while(!EmptyStack(&s))
	{
		temp=Pop(&s);
		if(temp != S[i]) return 0;  //不等则返回0 
		else i++;	
	}
	return 1;  //比较完毕均相等则返回1 
}

(2)如果允许在循环队列的两端都可以进行插入和删除操作。要求:

   ①写出循环队列的类型;

   ②写出“从队尾删除”和“从队头插入”的算法。

//① 
#define M 队列可能到达的最大长度
typedef struct
{
	elemtp data[M];
	int front, rear;
}cycqueue; 

//② 
elemtp delqueue(cycqueue Q)
{
	if(Q.front==Q.rear)
		{
			cout<<"队列空"<<endl;
			exit(0);
		}
	Q.rear=(Q.rear-1+M)%M;  //修改队尾指针
	return(Q.data[(Q.rear+1+M)%M]);  //返回出队元素 
}//从队尾删除算法结束 

void enqueue(cycqueue Q, elemtp x)
//Q是顺序存储的循环队列,本算法实现“从队头插入”元素x
{
	if(Q.rear==(Q.front-1+M)%M)
	{
		cout<<"队列满"<<endl;
		exit(0); 
	}
	Q.front=(Q.front-1+M)%M;
}//结束从队头插入算法 

(3)已知f为单链表的表头指针,链表中存储的都是整型数据,试写出实现下列运算的递归算法:

   ①求链表中的最大整数;

   ②求链表的结点个数;

   ③求所有整数的平均值。

//①
int GetMax(LinkList p)
{
	if(!p->next)
		return p->data;
	else
	{
		int max=GetMax(p->next);
		return p->data>=max?p->data:max;
		/*三元运算:表达式1?表达式2:表达式3
		如果表达式1的值为真,则返回表达式2的值,否则返回表达式3的值*/ 
	}
 } 

//②
int GetLength(LinkList p)
{
	if(!p->next)
		return 1;
	else
	{
		return GetLength(p->next)+1;
	}
 } 

//③
double GetAverage(LinkList p, int n)
{
	if(!p->next)
		return p->data;
	else
	{
		double ave=GetAverage(p->next, n-1);
		return (ave*(n-1)+p->data)/n;
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值