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