//想到两种方法,一是用栈把序列逆序对比,二是直接头尾对比字符串。
//问题:判断回文串 如1223不是回文串,而1221是
//思路1:分析以下回文的特点,会发现回文无论是正着读还是反着读都是一样的。所以只要进一次栈,出一次栈,看进入序列是否一样就好了
//思路2:直接判断前半段后半段对应位置是否相等。有不等的就不是回文。这个更简单些
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct stack{
char data;
stack *next;
}stack;
void Traversal(stack *p){ //遍历
stack *q = p->next;
while (q != NULL)
{
printf("%C ",q->data);
q = q->next;
}
}
void init(stack *&s);
int isEmpty(stack *s);
void push(stack *&s,char x);
int pop(stack *&s,char &x);
//直接头尾对比判断回文
// int huiwen(char *s,int n){ //回文返回0,非回文返回1
// stack *c = (stack *)malloc(sizeof(stack));
// c->next = NULL;
// for(int i=0,j=n-1;i<=j;i++,j--){
// if(s[i]!=s[j]) return 1; //数组版
// }
// return 0;
// }
//通过栈判断
int huiwen(char *s,int n){ //参数:字符串s,字符串长度n
stack *c = (stack *)malloc(sizeof(stack));
c->next = NULL;
for(int i=0;i<n;i++) push(c,s[i]);
char a;
for(int i=0;i<n;i++){
pop(c,a);
if(s[i] != a) return 1; //不是回文 //栈会把进栈序列逆序输出,如果输出序列等于字符串,那就是回文
}
return 0;
}
int main(){
//string s="1221";
char *str="ssccss";
printf("%d",huiwen(str,6));
getchar();
return 0;
}
//注:在考试的时候直接调用函数就好了。最多写个头文件
void init(stack *&s){ //栈初始化
s = (stack *)malloc(sizeof(stack));
s->next = NULL;
}
int isEmpty(stack *s){ //栈判空。栈空(栈链表只有头节点)1,不空0
if (s->next == NULL){
return 1;
}else{
return 0;
}
}
void push(stack *&s,char x){ //进栈 参数:栈s,进栈元素x
stack *p=(stack *)malloc(sizeof(stack));
p->next = NULL;
p->data = x;
p->next = s->next;
s->next = p;
}
int pop(stack *&s,char &x){ //出栈,参数:栈s,出栈元素X
stack *p;
if(isEmpty(s) == 1) return 0; //栈空,无法出栈
p = s->next;
x = p->data;
s->next = p->next;
free(p);
return 1;
}