c语言利用栈和队列的基本运算,设计一个算法,判断读入一个以“\n”为结束标识的字符序列是否为回文
时间: 2024-05-05 13:21:10 浏览: 23
回文是指正反顺序都相同的词语。比如“level”、“deified”、“civic”等都是回文。判断一个字符序列是否为回文,可以使用栈或队列的基本运算。
栈的基本运算包括进栈和出栈,可以将字符序列从左到右依次进栈,然后再依次出栈,得到的序列就是原序列的倒序。而队列的基本运算包括入队和出队,可以将字符序列从左到右依次入队,然后从左右两端各出队一个字符进行比较,如果相等则继续比较,直到队列为空或出现不相等的字符。
根据上述思路,设计一个算法如下:
1. 初始化一个栈S和一个队列Q;
2. 读入字符序列,将每个字符依次进栈和入队;
3. 从队列的左端和右端各出队一个字符进行比较,如果相等则继续比较,直到队列为空或出现不相等的字符;
4. 如果队列为空,则说明字符序列是回文,否则不是回文。
下面是该算法的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 定义栈结构体
struct Stack {
char data[MAX_SIZE];
int top;
};
// 定义队列结构体
struct Queue {
char data[MAX_SIZE];
int front, rear;
};
// 初始化栈
void initStack(struct Stack *S) {
S->top = -1;
}
// 判断栈是否为空
bool isEmptyStack(struct Stack S) {
return S.top == -1;
}
// 判断栈是否已满
bool isFullStack(struct Stack S) {
return S.top == MAX_SIZE - 1;
}
// 进栈
void push(struct Stack *S, char c) {
if (isFullStack(*S)) {
printf("Stack overflow!\n");
exit(1);
}
S->data[++S->top] = c;
}
// 出栈
char pop(struct Stack *S) {
if (isEmptyStack(*S)) {
printf("Stack underflow!\n");
exit(1);
}
return S->data[S->top--];
}
// 初始化队列
void initQueue(struct Queue *Q) {
Q->front = Q->rear = -1;
}
// 判断队列是否为空
bool isEmptyQueue(struct Queue Q) {
return Q.front == -1;
}
// 判断队列是否已满
bool isFullQueue(struct Queue Q) {
return Q.front == (Q.rear + 1) % MAX_SIZE;
}
// 入队
void enqueue(struct Queue *Q, char c) {
if (isFullQueue(*Q)) {
printf("Queue overflow!\n");
exit(1);
}
if (isEmptyQueue(*Q)) {
Q->front = Q->rear = 0;
} else {
Q->rear = (Q->rear + 1) % MAX_SIZE;
}
Q->data[Q->rear] = c;
}
// 出队
char dequeue(struct Queue *Q) {
if (isEmptyQueue(*Q)) {
printf("Queue underflow!\n");
exit(1);
}
char c = Q->data[Q->front];
if (Q->front == Q->rear) {
Q->front = Q->rear = -1;
} else {
Q->front = (Q->front + 1) % MAX_SIZE;
}
return c;
}
int main() {
struct Stack S;
struct Queue Q;
char c;
bool isPalindrome = true; // 是否为回文
initStack(&S);
initQueue(&Q);
printf("Please input a character sequence (end with \\n): ");
while ((c = getchar()) != '\n') {
push(&S, c);
enqueue(&Q, c);
}
while (!isEmptyQueue(Q)) {
if (dequeue(&Q) != pop(&S)) {
isPalindrome = false;
break;
}
}
if (isPalindrome) {
printf("The character sequence is palindrome.\n");
} else {
printf("The character sequence is not palindrome.\n");
}
return 0;
}
```