小程序就是比较简单,比较常见,当然也比较经典啦~~那么,肿么可以少了“回文的判断”
先上版本一:也是偷懒的版本,用数组实现的回文判断
/*
题目:判断用户输入的字符串是否是回文(正读和反读都相同的字符串称为回文)
版本一:用数组实现;
思路:正读和反读字符串并进行字符匹配,如果读至字符串末尾且读到的字符都相同则为回文
*/
#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,改程序,一直改正确为止,嘿嘿~
加油!!!