一、回文判断,用上节中的struct queue更方便一点,本节用stack作为入点
栈stack的一个难点是:指针top指向的是栈顶元素,还是空闲位置?
比如书中写法:top=0; top++; s[top] = x; -> 初始化起点为0,第一个写入元素位置为top=1; -> 这里top指针指向的是栈顶元素;所以最后判断语句是 top == 0!
我的写法,top=0;s[top] = x;top++; -> 初始化起点为0,第一个写入元素位置为top=0; -> 这里top指针指向的是栈顶的空闲位置;所以,在判断a[i]!=s[top] 之前,必须执行top = top-1; 使得指针指向栈中的元素;最后成立的条件是top==-1;
二、两种写法都记录,以便加深理解
EG1.
int stack(){
char a[100],s[100];
int i,mid,len,next,top;
gets(a);
len=strlen(a);
mid=len/2-1;
top=0;
if(len%2 == 0)
next = mid +1;
else
next = mid + 2;
for (i=0;i<=mid;i++){
s[top] = a[i];
top++;
}
top = top-1;
for (i=next;i<len;i++){
if (a[i]!=s[top])
break;
else
top--;
}
if (top == -1)
printf("YES");
else
printf("NO");
return 0;
}
EG2.
int main()
{
char a[101],s[101];
int i,len,mid,next,top;
gets(a); //读入一行字符串
len=strlen(a); //求字符串的长度
mid=len/2-1; //求字符串的中点
top=0;//栈的初始化
//将mid前的字符依次入栈
for(i=0;i<=mid;i++)
s[++top]=a[i];
//判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
if(len%2==0)
next=mid+1;
else
next=mid+2;
//开始匹配
for(i=next;i<=len-1;i++)
{
if(a[i]!=s[top])
break;
top--;
}
//如果top的值为0,则说明栈内所有的字符都被一一匹配了
if(top==0)
printf("YES");
else
printf("NO");
return 0;
}