利用栈和队列判断字符串是否是回文
时间: 2025-04-20 16:37:17 浏览: 44
### 使用栈和队列判断字符串是否为回文
为了验证一个字符串是否为回文,可以通过栈和队列这两种数据结构来进行操作。具体来说:
对于每一个字符,在不考虑非字母数字字符的情况下将其压入栈并加入到队列中[^2]。
当遍历完成后,依次比较栈顶元素与队首元素是否相同。如果全部匹配,则该字符串是回文;反之则不是。下面给出C语言中的实现方式[^1]:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 1000
typedef struct {
char data[MAX_SIZE];
int top;
} Stack;
void initStack(Stack *s) { s->top = -1; }
bool isEmptyStack(const Stack *s) { return (s->top == -1); }
void push(Stack *s, char ch) { if(s->top < MAX_SIZE-1)s->data[++(s->top)] = ch;}
char pop(Stack *s) { return isEmptyStack(s)?'\0':s->data[(s->top)--]; }
typedef struct {
char data[MAX_SIZE];
int front,rear;
} Queue;
void initQueue(Queue *q){ q->front=q->rear=0; }
bool isEmptyQueue(const Queue *q) {return(q->front==q->rear);}
void enqueue(Queue *q,char ch){
if((q->rear)<MAX_SIZE)(q->data[q->rear++]=ch);
}
char dequeue(Queue *q) { return isEmptyQueue(q)?'\0':q->data[q->front++];}
// 判断函数
bool isPalindrome(char str[]){
Stack stack;
Queue queue;
initStack(&stack);
initQueue(&queue);
for(int i=0;str[i]!='\0';i++){
if(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'){
push(&stack,tolower(str[i]));
enqueue(&queue,tolower(str[i]));
}else continue;
}
while(!isEmptyStack(&stack)){
if(pop(&stack)!=dequeue(&queue)) return false;
}
return true;
}
int main(){
char input[100]="";
printf("请输入待检测的字符串(以'@'结尾):");
scanf("%99[@^\n]",input);// 输入直到遇到换行符或达到最大长度
// 去除结束标志 '@'
size_t length=strlen(input)-1;
if(length>0 && input[length]=='@') input[length]='\0';
bool result=isPalindrome(input);
printf("\"%s\" %s 回文\n",input,result?"是":"不是");
return 0;
}
```
此程序首先初始化了一个栈和一个队列用于存储处理后的字符。接着通过`isPalindrome()`方法来检验输入字符串是否满足条件。最后根据返回的结果打印相应的提示信息。
阅读全文
相关推荐


















