利用栈和队列判断一个字符序列是否是回文。例如“abba”和“abdba”是回文,而“good”不是回文。(提示:将字符序列同时依次入栈和队列,然后同时依次出栈和出队,看是否一致)用C语言写完整代码
时间: 2024-11-25 21:15:00 浏览: 43
利用栈和队列判断字符序列是否是回文的一种常见方法是通过双指针策略,即一个指针从字符串的开始位置,另一个指针从结束位置向中间移动。在C语言中,可以先创建一个栈和一个队列来存储字符,并分别对它们进行操作:
```c
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
// 定义栈结构体
typedef struct {
char* data;
size_t capacity;
size_t top;
} Stack;
Stack* stack_init() {
Stack* s = (Stack*)malloc(sizeof(Stack));
if (!s) return NULL;
s->data = (char*)malloc(10); // 初始化容量为10
s->capacity = 10;
s->top = -1;
return s;
}
void stack_push(Stack* s, char c) {
if (s->top == s->capacity - 1) {
s->data = (char*)realloc(s->data, s->capacity * 2);
if (!s->data) return;
s->capacity *= 2;
}
s->data[++s->top] = c;
}
bool is_palindrome(char* str) {
Stack* stack = stack_init();
Queue* queue = queue_init(); // 假设Queue是一个自定义的数据结构
if (str == NULL || strlen(str) == 0) return true; // 空字符串视为回文
for (size_t i = 0; i < strlen(str) / 2; i++) {
stack_push(stack, str[i]);
queue_enqueue(queue, str[strlen(str) - 1 - i]); // 双头推进
}
// 检查栈顶元素是否等于队首元素
while (stack_top(stack) != '\0' && queue_front(queue) != '\0') {
if (stack_pop(stack) != queue_dequeue(queue)) {
return false;
}
}
// 如果遍历完栈和队列还有剩余元素,则不是回文
return (stack_top(stack) == '\0' && queue_front(queue) == '\0');
}
void free_stack(Stack* s) {
free(s->data);
free(s);
}
void main() {
char str1[] = "abba";
char str2[] = "abdba";
char str3[] = "good";
printf("Is %s a palindrome? %d\n", str1, is_palindrome(str1));
printf("Is %s a palindrome? %d\n", str2, is_palindrome(str2));
printf("Is %s a palindrome? %d\n", str3, is_palindrome(str3));
// 清理内存
free_stack(stack_init());
// 你需要实现queue_init(), enqueue(), dequeue(), 和 queue_destroy()函数来处理队列
}
阅读全文