在编程和算法的世界里,回文字符串是一个常见的话题。回文字符串是指一个字符串正读和倒读都相同,例如“radar”或“level”。在本文中,我们将探讨如何使用C语言和两种数据结构——堆栈(Stack)和队列(Queue)——来检查一个字符串是否为回文。
数据结构简介
堆栈(Stack)
堆栈是一种先进后出(FILO)的数据结构,可以想象成一摞盘子,你只能取最上面的盘子,也只能在最上面添加新的盘子。在本程序中,我们使用一个数组stack
来模拟堆栈,并通过一个变量top
来跟踪堆栈顶部的元素。
队列(Queue)
队列是一种先进先出(FIFO)的数据结构,可以想象成排队买票,先来的人先买到票。在本程序中,我们使用一个数组queue
来模拟队列,并通过两个变量front
和rear
来分别跟踪队列的首部和尾部元素。
程序逻辑
-
初始化:定义两个数组
stack
和queue
,以及相关的控制变量top
、front
和rear
,用于存储字符串字符,并初始化它们。 -
堆栈和队列操作:实现基本的堆栈和队列操作,包括
push
和pop
操作用于堆栈,insert
和deleteElement
操作用于队列。 -
检查回文:通过以下步骤检查字符串是否为回文:
- 将字符串的每个字符依次压入堆栈和插入队列。
- 依次从堆栈弹出和从队列删除元素,比较这两个元素。由于堆栈和队列的操作特性,如果字符串是回文,这两个元素应该是相等的。
- 如果所有相应位置的字符都相等,则字符串是回文;否则,不是回文
--------------------------------------------------------------------------------------------------------------------------------------
附上完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100 // 根据实际需求设定,足够存储输入的字符串
char stack[SIZE];
char queue[SIZE];
int top = -1, front = -1, rear = -1;
// 堆栈相关操作
void push(char c){
// 堆栈满了的情况
if(top == SIZE-1){
printf("堆栈溢出\n");
exit(1);
}
stack[++top] = c; // 把字符压入堆栈
}
char pop(){
// 堆栈为空的情况
if(top == -1){
printf("堆栈下溢\n");
exit(1);
}
return stack[top--]; // 弹出堆栈的顶部元素
}
// 队列相关操作
void insert(char c){
// 队列满了的情况
if(rear == SIZE-1){
printf("队列溢出\n");
exit(1);
}
if(front == -1) front = 0; // 如果队列一开始是空的,设置队列头部为 0
queue[++rear] = c; // 向队列的尾部插入元素
}
char deleteElement(){
// 队列为空或者头指针前进过尾指针的情况
if(front == -1 || front > rear){
printf("队列下溢\n");
exit(1);
}
return queue[front++]; // 删除Queue的首部元素
}
// 检查字符串是否为回文
int checkPalindrome(char str[]){
int i, len = strlen(str);
// 逐字符压入堆栈和插入队列
for(i = 0; i < len; i++){
push(str[i]);
insert(str[i]);
}
// 逐字符从堆栈和队列取出进行比较
for(i = 0; i < len; i++){
if(pop() != deleteElement()) return 0; // 如果某一对字符不相等,说明不是回文
}
return 1; // 所有对字符都相等,说明是回文
}
int main(){
char str[SIZE], c;
int i = 0;
printf("请输入字符串 (以#结束): ");
while ((c = getchar()) != '#' && c != '\n' && i < SIZE-1){
str[i++] = c;
}
str[i] = '\0'; // 结束字符串
// 判断并输出结果
if(checkPalindrome(str)){
printf("这个字符串是回文字符串。\n");
} else {
printf("这个字符串不是回文字符串。\n");
}
return 0;
}