数据结构严蔚敏(c语言版)课后算法题答案-栈和队列

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

#include //判定是否回文
#include
#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;itop==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
#include
#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=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;
	}
}

你可能感兴趣的:(数据结构严蔚敏版答案,数据结构,算法,c语言)