我们把正读和反读都相同的字符序列称为“回文”,例如abba和abcba是回文,abcde不是回文。尝试写一个算法判别读入的一个以@为结束符的字符是否是回文。
输入格式
输入为一行,为待判断的字符串,以@结尾。字符串长度不超过 100100,除最后一个字符外,其余字符均由小写字母组成。
输出格式
输出一行,如果输入的字符串是回文,则输出true;如果输入的字符串不是回文,则输出false。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ERROR 0
#define OK 1
typedef struct Queue{
char *data;
int head, tail, length;
}Queue;
void initq(Queue *q, int length) {
q->data = (char *)malloc(sizeof(char) * length);
q->head = 0;
q->tail = -1;
q->length = length;
}
void pushq(Queue *q, char element) {
if (q->tail + 1 >= q->length) {
return ERROR;
}
q->tail++;
q->data[q->tail] = element;
return OK;
}
char out_putq(Queue *q, char *s) {
for (int i = q->head; i <= q->tail; i++) {
s = q->data[i];
}
return s;
}
void clearq(Queue *q) {
free(q->data);
free(q);
}
typedef struct Stack{
char *elements;
int max_size, top_index;
}Stack;
void inits(Stack *s, int size) {
s->elements = (char *)malloc(sizeof(char) * size);
s->max_size = size;
s->top_index = -1;
}
void pushs(Stack *s, char element) {
if (s->top_index + 1 >= s->max_size) {
return ERROR;
}
s->top_index++;
s->elements[s->top_index] = element;
return OK;
}
int empty(Stack *s) {
return s->top_index < 0;
}
char out_puts(Stack *s, char *s2) {
while (!empty(s)){
s2 = s->elements[s->top_index];
s->top_index--;
}
return s2;
}
void clears(Stack *s) {
free(s->elements);
free(s);
}
int main() {
char *s = {0}, *s1 = {0}, *s2 = {0};
Queue *queue = (Queue *)malloc(sizeof(Queue));
initq(queue, 100);
Stack *stack = (Stack *)malloc(sizeof(Stack));
inits(stack, 100);
while ((s = getchar())!= '@') {
pushq(queue, s);
pushs(stack, s);
}
s1 = out_putq(queue, s);
s2 = out_puts(stack, s);
if (s1 == s2) {
printf("true\n");
} else {
printf("false\n");
}
clearq(queue);
clears(stack);
return 0;
}