试写一个算法判别读入的一个以‘@’为结束符的字符序列是否为“回文”。 例如: abcdedcba 或 abccba 是回文。 算法思想: 将依次读入的字符分别插入栈和队列,然后依次比较“栈顶”和“队头”的字符。用C语言循环队列解决
时间: 2024-10-21 19:15:25 浏览: 3
为了判断一个以'@'为结束符的字符序列是否为回文,我们可以使用C语言编写一个简单的算法。首先,我们需要创建一个循环队列来存储字符,因为队列的特点是从前往后出,可以用于对比两端字符。以下是具体的步骤:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char *data;
int front; // 队首元素的索引
int rear; // 队尾元素的索引
int capacity;
} Queue;
// 初始化循环队列
Queue* create_queue(int capacity) {
Queue *queue = (Queue*)malloc(sizeof(Queue));
queue->data = malloc(capacity);
queue->front = -1;
queue->rear = -1;
queue->capacity = capacity;
return queue;
}
// 入队操作
void enqueue(Queue *queue, char c) {
if ((queue->rear + 1) % queue->capacity == queue->front) {
printf("Queue is full.\n");
return;
}
queue->rear = (queue->rear + 1) % queue->capacity;
queue->data[queue->rear] = c;
}
// 出队操作
char dequeue(Queue *queue) {
if (queue->front == queue->rear) {
printf("Queue is empty.\n");
return '\0';
}
char c = queue->data[queue->front];
queue->front = (queue->front + 1) % queue->capacity;
return c;
}
// 判断字符串是否为回文
int is_palindrome(char *str) {
Queue *queue = create_queue(strlen(str) / 2);
for (int i = 0; str[i] != '@'; ++i) {
enqueue(queue, str[i]);
}
while (queue->front != queue->rear) {
if (dequeue(queue) != dequeue(&queue)) {
return 0; // 如果有不匹配,则不是回文
}
}
return 1; // 所有字符匹配,所以是回文
}
int main() {
char input[] = "abcdedcba@";
if (is_palindrome(input)) {
printf("%s is a palindrome.\n", input);
} else {
printf("%s is not a palindrome.\n", input);
}
free(queue->data);
free(queue);
return 0;
}
```
阅读全文