**XDOJ 269 判断字符串是否为回文(即是否有中心对称关系
***答题思路:如果字符串长度为偶数,则将其一半入栈,然后取栈顶与剩下的一半字符串相比较,若全部匹配,则回文,若有一个不匹配,则不回文;
如果字符串长度为奇数,则将中间的字符舍去,即将(length-1)/2的元素进栈,然后从第(length-1)/2+2个字符开始比较。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STACK_INIT_SIZE 100
#define ERROR 0
/*
写这个为了复习用,代码比较乱
*/
//使用顺序栈
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
//创建栈
void Init(SqStack &S)
{
S.base=S.top=(char *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!S.base)exit(ERROR);
S.stacksize=STACK_INIT_SIZE;
}
//入栈
void Push(SqStack &S,char a)
{
*S.top++=a;
}
//出栈
void Pop(SqStack &S)
{
*--S.top;
}
//取栈顶
int Gettop(SqStack S)
{
return *(S.top-1);
}
//判断栈是否为空
int isEmpty(SqStack S)
{
if(S.top-S.base>0)
return 1;
else
return 0;
}
int main()
{
int len;
char str[100];
int sign=1;
SqStack S;
Init(S);
gets(str);
len=strlen(str);
if(len%2==0)//长度为偶数
{
int i;
for(i=0;i<len/2;i++)//将一半入栈
Push(S,str[i]);
while(isEmpty(S))
{
if(Gettop(S)==str[i++])//比较
{
Pop(S);
}
else
{
sign=0;
break;
}
}
}
if(len%2==1)
{
int i;
for(i=0;i<(len-1)/2;i++)
Push(S,str[i]);
i++;//前进元素
while(isEmpty(S))
{
if(Gettop(S)==str[i++])
{
Pop(S);
}
else
{
sign=0;
break;
}
}
}
if(sign)
printf("right\n");
else
printf("wrong\n");
return 0;
}