(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;
}
}