用c语言写出下面题目,回文是指正读反读均相同的字符序列,如"abba"和"abdba"均是 回文,但"good"不是回文。试写-个算法判定给定的字符序列是否 为回文。(提示: 将一半字符入栈。 )
时间: 2023-12-31 12:03:42 浏览: 99
判断字符序列是否是回文
5星 · 资源好评率100%
可以使用栈来解决该问题,首先遍历字符串的一半,将其入栈,然后从字符串的中间位置开始继续遍历,每次将栈中的元素出栈与当前位置的字符进行比较,如果不相同则不是回文,否则继续比较直至结束。
代码如下:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100
typedef struct {
char data[MAX_SIZE];
int top;
} Stack;
void init(Stack *s) {
s->top = -1;
}
bool is_empty(Stack *s) {
return s->top == -1;
}
bool is_full(Stack *s) {
return s->top == MAX_SIZE - 1;
}
void push(Stack *s, char c) {
if (is_full(s)) {
printf("Stack overflow.\n");
return;
}
s->top++;
s->data[s->top] = c;
}
char pop(Stack *s) {
if (is_empty(s)) {
printf("Stack underflow.\n");
return '\0';
}
char c = s->data[s->top];
s->top--;
return c;
}
bool is_palindrome(char *str) {
Stack s;
init(&s);
int len = strlen(str);
int mid = len / 2;
int i;
for (i = 0; i < mid; i++) {
push(&s, str[i]);
}
if (len % 2 == 1) {
i++;
}
while (str[i] != '\0') {
char c = pop(&s);
if (c != str[i]) {
return false;
}
i++;
}
return true;
}
int main() {
char str[MAX_SIZE];
printf("请输入字符序列:");
scanf("%s", str);
if (is_palindrome(str)) {
printf("%s是回文。\n", str);
} else {
printf("%s不是回文。\n", str);
}
return 0;
}
```
阅读全文