假设正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’ 和‘ababab’则不是回文。假设一字符序列已存入计算机,利用栈判断其是否为回文。请编写程序实现算法。用C语言实现
时间: 2024-10-24 18:10:47 浏览: 44
在C语言中,我们可以使用两个栈来判断一个字符串是否为回文。一个栈用于存储字符串的前半部分,另一个栈用于存储对应的后半部分。遍历字符串的过程中,依次将每个字符压入两个栈中,然后弹出后半部分栈的顶元素并与当前字符比较。如果所有字符都能对应匹配,则该字符串是回文。
以下是简单的C语言函数实现:
```c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define MAX_STACK_SIZE 100
typedef struct {
char data[MAX_STACK_SIZE];
int top;
} Stack;
bool isPalindrome(char* str) {
Stack stack1, stack2;
stack1.top = -1;
stack2.top = -1;
int len = strlen(str);
// 将前半部分字符压入stack1
for (int i = 0; i < len / 2; i++) {
stack1.data[++stack1.top] = str[i];
}
// 如果长度是奇数,中间的字符单独处理
if (len % 2 != 0) {
str[len / 2] = '\0'; // 在中间添加结束符
}
// 从后半部分开始,与stack1对应字符对比
for (int i = len / 2; i >= 0; i--) {
if (str[i] == stack1.data[stack1.top--]) {
continue;
} else {
return false;
}
}
return true;
}
// 测试示例
int main() {
char test[] = "aba";
if (isPalindrome(test)) {
printf("'%s' 是回文\n", test);
} else {
printf("'%s' 不是回文\n", test);
}
return 0;
}
```
这个程序首先初始化两个栈,然后通过循环将前半部分的字符压入第一个栈,同时检查后半部分的字符是否与第一个栈的顶部字符相等。如果所有字符都匹配,则返回`true`,表示是回文;否则返回`false`。
阅读全文