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

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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级码立

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值