C语言可以利用顺序栈来实现回文序列的判断,下面是实现的完整攻略。
什么是回文序列?
回文序列是一个正读与反读都相同的序列,例如:121, abccba。
用顺序栈实现回文序列判断
算法思路
回文序列的判断可以利用栈的先进后出的特性,我们可以将序列的前一半依次入栈,后一半依次和栈中元素进行出栈比较。如果每次比较都相等,则说明是回文序列。
代码实现
下面是C语言代码实现,加入了两条示例供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAXSIZE 100
typedef struct
{
char data[MAXSIZE];
int top;
} SeqStack;
// 初始化栈
SeqStack* InitStack()
{
SeqStack* s;
s = (SeqStack*) malloc(sizeof(SeqStack));
s->top = -1;
return s;
}
// 判断栈是否为空
bool IsEmpty(SeqStack* s)
{
return (s->top == -1) ? true : false;
}
// 入栈
bool Push(SeqStack* s, char c)
{
if (s->top == MAXSIZE - 1)
{
return false;
}
s->top++;
s->data[s->top] = c;
return true;
}
// 出栈
bool Pop(SeqStack* s, char *c)
{
if (IsEmpty(s))
{
return false;
}
*c = s->data[s->top];
s->top--;
return true;
}
// 获取栈顶元素
bool GetTop(SeqStack* s, char *c)
{
if (IsEmpty(s))
{
return false;
}
*c = s->data[s->top];
return true;
}
// 判断回文序列
bool IsPalindrome(char* str)
{
SeqStack* stack;
stack = InitStack();
int len = strlen(str);
for (int i = 0; i < len / 2; i++) // 入栈前半部分
{
Push(stack, str[i]);
}
for (int i = len / 2 + len % 2; i < len; i++) // 依次和栈中元素出栈比较
{
char c = '\0';
Pop(stack, &c);
if (c != str[i])
{
return false;
}
}
return true;
}
// 示例一
void Example1()
{
char* str = "abccba";
if (IsPalindrome(str))
{
printf("%s是回文序列\n", str);
}
else
{
printf("%s不是回文序列\n", str);
}
}
// 示例二
void Example2()
{
char* str = "hello";
if (IsPalindrome(str))
{
printf("%s是回文序列\n", str);
}
else
{
printf("%s不是回文序列\n", str);
}
}
int main(int argc, char const *argv[])
{
Example1();
Example2();
return 0;
}
输出结果:
abccba是回文序列
hello不是回文序列
上述代码,先定义了一个顺序栈结构体,包括栈中数据和栈顶指针,接着实现了初始化栈、入栈、出栈、获取栈顶元素、判断栈是否为空等操作。然后实现了主要的IsPalindrome函数,用于判断回文序列,最后加入了两个示例来演示函数的使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言如何用顺序栈实现回文序列判断 - Python技术站