小程序:回文的判断

小程序就是比较简单,比较常见,当然也比较经典啦~~那么,肿么可以少了“回文的判断”大笑

先上版本一:也是偷懒的版本,用数组实现的回文判断

/*
题目:判断用户输入的字符串是否是回文(正读和反读都相同的字符串称为回文)
版本一:用数组实现;
思路:正读和反读字符串并进行字符匹配,如果读至字符串末尾且读到的字符都相同则为回文
*/
#include<stdio.h>

int getLen(char *ch)
{
	int len = 0;
	while(*ch!='\0')
	{
		len++;
	    ch++;
	}
	return len;		
}

int isCircle(char *ch,int len)
{
	char *p,*q;

	p=ch;
	q=ch+len-1;

	for(int i=0;i<len;i++)
	{
		if(*p==*q)
		{
			p++;
			q--;
		}
		else
		{
			return 0;
		}
	}

	return 1;


}

int main(void)
{
  char ch[50];
  int len;
  bool result;

  printf("请输入所需判断的字符串(len<50):");
  scanf("%s",ch);
  
  len=getLen(ch);
  //printf("The length of the string is %d\n",len);

  result = isCircle(ch,len);
  if(result)
	  printf("您输入的字符串是回文\n");
  else
      printf("您输入的字符串不是回文\n");

}

第一个版本是昨天晚上敲的。

版本二是今天弄的改进版,上程序,上程序,吼吼~~

/*
题目:判断用户输入的字符串是否是回文(正读和反读都相同的字符串称为回文)
版本二:用栈和队列实现回文判断
思路:栈(先进后出),队列(先进先出),用栈和队列的特性恰好可以实现字符串的正反比较
*/
#include<stdio.h>
#include<stdlib.h>

//栈的结构体定义
#define STACK_SIZE 50

typedef struct{
    char stack[STACK_SIZE];
	int top;  
}Stack;

//队列的定义
typedef struct Node{
	char data;
	struct Node *next;  
}LinkNode;

typedef struct
{
	LinkNode *front;
	LinkNode *rear;
}LinkHead;

//栈的相关操作

//初始化
void InitS(Stack *s)
{
	s->top = -1;//初始化为-1,首个元素的位置恰好为0
}

//入栈
int Push(Stack *s,char ch)
{
	if(STACK_SIZE-1==s->top)
		return 0;//栈满

	s->top++;
	s->stack[s->top] = ch;
    return 1;
}

//出栈
int Pop(Stack *s,char *ch)
{
	if(-1 == s->top)
		return 0;//栈空
	*ch = s->stack[s->top];
	s->top--;
	return 1;
}

//队列的相关操作
//初始化
void InitQ(LinkHead *q)
{
	q->front = (LinkNode *)malloc(sizeof(LinkNode));
	if(NULL==q->front)
	{
		printf("分配空间失败");
		return;
	}
	q->rear=q->front;
	q->front->next = NULL;
}

//入队
int EnterQ(LinkHead *q,char ch)
{
	LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));
	if(NULL == node)
		return 0;
	node->data = ch;
	node->next = NULL;
	q->rear->next = node;
	q->rear = node;
	return 1;
}

int DeleteQ(LinkHead *q,char *ch)
{
	LinkNode *node;

	if(q->front==q->rear)  //仅剩头节点
		return 0;
	
	node = q->front->next;
	q->front->next = node->next;
	if(q->rear==node)
		q->rear=q->front;
	*ch = node->data;
	free(node);
	return 0;
}

int getStr(Stack *s,LinkHead *q)
{
	int len=0,ch=0;

	printf("请输入字符序列,当输入@时输入结束\n");
	while(ch!='@')
	{
		ch=getchar();
		if(ch!='@')
		{
			//printf("%c",ch);
			Push(s,ch);
			EnterQ(q,ch);
			len++;
		}	
	}

	return len;
}

int isCircle(Stack *s,LinkHead *q)
{
	bool result = true;
	char ch1,ch2;
	int len;

	InitS(s);
	InitQ(q);
	
    len = getStr(s,q);

	//printf("输入结束\n");
    //printf("m=%d\n",m);

	for(int i=1;i<(len+1)/2;i++)
	{
		Pop(s,&ch1);
		DeleteQ(q,&ch2);
        //printf("\nDebug Message i=%d,ch1=%d,ch2=%d\n",i,ch1,ch2);
		if(ch1!=ch2)
		{
			result = false;
			break;
		}
	}

  return result;
}

int main(void)
{
    bool result = true;
	
	Stack *s = (Stack *)malloc(sizeof(s));
	LinkHead *q = (LinkHead *)malloc(sizeof(q));
	
	result = isCircle(s,q);

	if(result)
	  printf("\n您输入的字符串是回文\n");
    else
      printf("\n您输入的字符串不是回文\n");

	return 0;
}

末了,插句体外话,程序中有几个printf我只是Mark掉了,但没有删掉,我个人认为这个是比较有用的,其实是我自己Debug用到的。

曾今不知那位牛人说过,程序是改出来的。

真理呀,没有一次成型的程序,哪怕是一次就编译,链接,运行,结果正确,那么也要回头再看一眼。

像看许久不见的情人那样深情,像看自己孩子般那样疼爱,仔仔细细再看一遍,还有许多可以提高的地方。

当然了,如果你和我一样,菜菜的,若若的,编译了一下,N多错误提示,好不容运行起来,我勒个去,错的!!!那咱就老老实实加Log,改程序,一直改正确为止,嘿嘿~

加油!!!






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值