如何用C语言实现一个只存储字符的顺序栈,并利用其特性来检查输入字符串是否为回文?请提供相应的代码示例和步骤。
时间: 2024-10-28 15:12:21 浏览: 12
在C语言中,我们可以使用数组来实现一个只存储字符的顺序栈。为了判断一个字符串是否为回文,我们需要遍历字符串的一半,将一半的字符压入栈,然后依次弹出并与另一半的字符对比。如果每对字符都相等,则字符串是回文。以下是具体的代码实现和步骤:
```c
#include <stdio.h>
#include <string.h>
#define MAX_CHAR_STACK 50
typedef struct {
char stack[MAX_CHAR_STACK]; // 字符栈存储区
int top; // 栈顶指针
} CharStack;
// 初始化字符栈
void init(CharStack *cs) {
cs->top = -1;
}
// 判断字符栈是否为空
int isEmpty(CharStack *cs) {
return (cs->top == -1);
}
// 入栈
void push(CharStack *cs, char c) {
if (cs->top < MAX_CHAR_STACK - 1) {
cs->stack[++cs->top] = c;
} else {
printf("Stack overflow!\n");
}
}
// 出栈并返回字符
char pop(CharStack *cs) {
if (!isEmpty(cs)) {
return cs->stack[cs->top--];
} else {
printf("Stack underflow!\n");
return '\0';
}
}
// 检查字符串是否为回文
int isPalindrome(char str[]) {
CharStack cs;
init(&cs);
int len = strlen(str);
for (int i = 0; i < len / 2; ++i) { // 遍历字符串的一半
push(&cs, str[i]);
}
for (int i = len / 2; i < len; ++i) { // 对比剩余的另一半字符
if (str[i] != pop(&cs)) {
return 0; // 不是回文
}
}
return 1; // 是回文
}
int main() {
char str[] = "madam";
if (isPalindrome(str)) {
printf("%s is a palindrome.\n", str);
} else {
printf("%s is not a palindrome.\n", str);
}
return 0;
}
```
在这个程序中,`isPalindrome`函数首先将字符串的一半字符压入栈,然后逐个比较剩下的字符和栈顶字符是否相等。如果有任何一个不匹配,就立即返回false,表示不是回文。当所有剩余字符都验证无误后,返回true,表明整个字符串是回文。
阅读全文