回文判断的两种方法

//想到两种方法,一是用栈把序列逆序对比,二是直接头尾对比字符串。
//问题:判断回文串 如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;
}


posted @ 2020-11-16 19:15  封不烦  阅读(1269)  评论(0编辑  收藏  举报