( 2 )回文是指正读反读均相同的字符序列, 如"abba ” 和“ abdba ” 均是回文, 但"good"
不是回文。试写一个算法判定给定的字符向量是否为回文。( 提示: 将一半字符入栈)
#include<stdio.h> //判定是否回文
#include<string.h>
#define maxsize 100
typedef struct
{
char base[maxsize];
char *top;
}stack;
int Huiwen(char *t);
int push(stack *s,char *t);
int pop(stack *s);
main()
{
int flag;
char *str="assqssa";
flag=Huiwen(str);
if(flag==1) printf("是回文");
else printf("不是回文");
}
int Huiwen(char *t)
{
char p;
int len;
stack s;
len=strlen(t);
s.top=s.base;
for(int i=0;i<len/2;i++) { push(&s,t); t++; }
while(s.top!=s.base)
{ p=pop(&s);
if(len%2==0)
{ if(*t++!=p) return 0; }
else
{ if(*++t!=p) return 0; }
}
return 1;
}
int push(stack *s,char *t)
{
if(s->top==s->base+maxsize) return 0;
*s->top++=*t;
}
int pop(stack *s)
{
int e;
if(s->top==s->base) return 0;
e=*--s->top;
return e;
}
( 3 ) 设从键盘输入一整数的序列: al , a2 , a3,..., an , 试编写算法实现: 用栈结构存储
输入的整数, 当ai!=1 时, 将进栈; 当ai=-1 时, 输出栈顶整数并出栈。算法应对异常情况( 入栈满等) 给出相应的信息。
int comput(stack *s)
{
int i;
while(s->top-s->base!=maxsize)//指针变量之间能相减,不能相加。
{
scanf("%d",&i);
if(i==-1)
{
if(s->top==s->base) { printf("空栈"); return 0;}
else
while(s->top!=s->base) printf("%d ",*--s->top);
return 0;
}
*s->top++=i;
}
printf("栈已满");
return 0;
}
( 5 ) 假设以丨和O 分别表示人栈和出栈操作。栈的初态和终态均为空, 人栈和出栈的操作序
列可表示为仅由丨和O 组成的序列, 称可以操作的序列为合法序列, 否则称为非法序列。写出一个算法, 判定所给的操作序列是否合法。若合法, 返回e , 否则返回false ( 假定被判定的操作序列己存人一维数组中)。
#include<stdio.h>
#include<string.h>
#define true 1
#define false 0
int comput(char *s);
main()
{
char *str="IIIOOIOO";
int n;
n=comput(str);
if(n==1) printf("合法");
else printf("不合法");
}
int comput(char *t) //法1
{
int sum=0;
int a1=0,a2=0;
int len;
char *r=t;
len=strlen(t);
while(sum>=0&&t!=r+len)
{
if(*t=='I') {sum=sum+1; a1++; }
else if (*t=='O') {sum=sum-1; a2++; }
t++;
}
if(sum==0&&a1==a2) return true;
else return false;
}
int comput(char a[]) //法2
{
int a1=0,a2=0;
int len;
len=strlen(a);
int i=0;
while(a1>=a2&&i<len) //或者while(a1>=a2&&a[i]!='\0')
{
if(a[i]=='I') a1++;
else if (a[i]=='O') a2++;
i++;
}
if(a1==a2) return true;
else return false;
}
( 10 ) 已知f 为单链表的表头指针, 链表中存储的都是整型数据, 试写出实现下列运算的递归
算法:
求链表中的最大整数;
求链表的结点个数;
求所有整数的平均值。
int getmax(Link &f) //求链表最大整数
{
if(!f->next)
return f->data;
else
{
int max=getmax(f->next);
if(max>=f->data) return max;
else return f->data;
}
}
int getlength(Link &f) //求链表结点个数
{
if(!f->next)
return 1;
return getlength(f->next)+1;
}
int getaverage(Link &f,int n) //求所有整数的平均数
{
if(!f->next)
return f->data;
else{
double ave=getaverage(f->next,n-1);
return (ave*(n-1)+f->data)/n;
}
}