[算法设计]回文是指正读反读均相同的字符序列, 如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符序列是否为回文。(提示:将一半字符入栈)用C语言写出来,写的代码要适用Visual C++ 6.0这个软件
时间: 2024-12-15 21:20:06 浏览: 23
回文数是指正读和反读都相同的数.docx
在C语言中,我们可以使用栈的数据结构来检查一个字符串是否是回文。以下是适用于Visual C++ 6.0的一个简单算法实现:
```c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
// 定义栈的结构体
typedef struct {
char *top;
int capacity;
} Stack;
// 初始化栈
void init(Stack *s, int capacity) {
s->top = NULL;
s->capacity = capacity;
}
// 判断栈是否为空
bool isEmpty(Stack *s) {
return s->top == NULL;
}
// 入栈操作
void push(Stack *s, char c) {
if (isEmpty(s)) {
s->top = (char*)malloc(sizeof(char));
s->top[0] = c;
s->top++;
} else {
char* new_top = (char*)realloc(s->top, (s->top - s->capacity + 1) * sizeof(char));
new_top[s->top - s->capacity] = c;
s->top++;
s->top = new_top;
}
}
// 出栈并返回栈顶元素
char pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return '\0';
}
char c = s->top[-1];
s->top--;
return c;
}
// 检查字符串是否为回文
bool isPalindrome(const char* str) {
Stack stack;
init(&stack, strlen(str)/2);
// 将前半部分字符串入栈
for (int i = 0; i < strlen(str) / 2; i++) {
push(&stack, str[i]);
}
// 比较后半部分字符串与出栈的元素
for (int i = strlen(str) / 2; i < strlen(str); i++) {
if (str[i] != pop(&stack)) {
return false;
}
}
// 如果能完全匹配,则是回文
return true;
}
int main() {
char input[] = "abba";
if (isPalindrome(input)) {
printf("%s is a palindrome.\n", input);
} else {
printf("%s is not a palindrome.\n", input);
}
return 0;
}
```
这个程序首先初始化了一个栈,并将输入字符串的一半字符压入栈中。然后逐个比较剩余的字符与栈顶出栈的字符,如果有一对不匹配,则返回false,表示非回文;否则,说明整个字符串是回文。
阅读全文