回文判斷的兩種方法


//想到兩種方法,一是用棧把序列逆序對比,二是直接頭尾對比字符串。
//問題:判斷回文串 如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;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM