回文判断:正读和反读都相同的字符序列称为回文。
从回文的定义可以看出,回文字符串的正序和逆序输出结果是相同的,算法需要做的就是将字符串串进行进栈然后出栈操作,将其与正序字符串进行比较,相同则为回文。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//以下是自己写的关于链式栈的基本操作,之后在进行回文字符串的判断
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef int Status;
typedef struct LNode //栈元素节点
{
ElemType data; //数据
struct LNode* next; //指向下一个节点
}LNode, * LinkStack;
Status InitStack(LinkStack& S) //链式栈初始化
{
S = (LNode*)malloc(sizeof(LNode));
if (S == NULL) exit(0);
S->next = NULL;
return OK;
}
Status DestroyStack(LinkStack& S) //链式栈销毁
{
LNode* p = S;
LNode* q = p;
while (p)
{
q = p;
p = p->next;
free(q);
}
free(q);
return OK;
}
Status ClearStack(LinkStack& S) //链式栈清空
{
if (S->next == NULL) return OK;
LNode* p = S->next;
LNode* q;
while (p)
{
q = p;
p = p->next;
free(q);
}
S->next = NULL;
return OK;
}
Status StackEmpty(LinkStack S) //链式栈判空
{
if (S->next == NULL) return OK;
return ERROR;
}
Status StackLength(LinkStack S) //链式栈元素个数
{
LNode* p = S;
int i = 0;
while (p->next)
{
i++;
p = p->next;
}
return i;
}
Status GetTop(LinkStack S, ElemType& e) //链式栈获取栈顶元素
{
if (S->next == NULL) return ERROR;
e = S->next->data;
return OK;
}
Status StackTraverse(LinkStack S) //链式栈遍历
{
if (S->next == NULL) return ERROR;
LNode* p = S->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
Status Push(LinkStack& S, ElemType e) //链式栈进栈
{
LNode* p = (LNode*)malloc(sizeof(LNode));
if (p == NULL) exit(0);
p->data = e;
p->next = S->next;
S->next = p;
return OK;
}
Status Pop(LinkStack& S, ElemType& e) //链式栈出栈
{
if (S->next == NULL) return ERROR;
e = S->next->data;
LNode* p = S->next;
S->next = p->next;
free(p);
return OK;
}
Status CheckPalindrome(char* str) //回文字符串的判断算法
{
//检查str字符串是否回文,是回文返回OK,不是回文返回ERROR
LinkStack S;
InitStack(S);
int str_len = strlen(str);
//将字符逐个压栈
for (int i = 0; i < str_len; i++)
{
Push(S, str[i]);
}
ElemType e;
//从栈中逐个弹出字符并将其与字符串的正序进行比较
for (int i = 0; i < str_len; i++)
{
Pop(S, e);
if (e != str[i]) return ERROR; //不是回文
}
DestroyStack(S);
return OK;
}
int main()
{
char str[100];
printf("输入字符串:");
gets(str);
if (CheckPalindrome(str) == 1)
printf("是回文字符串\n");
else
printf("不是回文字符串\n");
return 0;
}
运行结果如下: