본문 바로가기
DSA

회문(Palindrome) 검사 (덱)

by KWONE 2024. 10. 27.

수정중.. 제대로 작동안한다.

회문이 아닌경우에도 회문으로 뜨거나 

회문인 경우도 전부 회문이 아니라고 뜬다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
typedef char element;
typedef struct {
    int front;
    int rear;
    element data[MAX_SIZE];
}DequeType;
void error(char* message) {
    fprintf(stderr, "%s\n", message);
    exit(1);
}
void init_deque(DequeType* q) {
    q->front = 0;
    q->rear = 0;
}
int is_empty_deque(DequeType* q) {
    return q->front == q->rear;
}
int is_full_deque(DequeType* q) {
    return (q->rear+1)%MAX_SIZE == q->front;
}

void add_front(DequeType* q, element e) {
    if (is_full_deque(q)) {
        error("FULL DEQUE");
    }
    q->data[q->front] = e;
    q->front=(q->front-1+MAX_SIZE)%MAX_SIZE;
}
void add_rear(DequeType* q, element e) {
    if (is_full_deque(q)) {
        error("EMPTY DEQUE");
    }
    q->rear=(q->rear+1)%MAX_SIZE;
    q->data[q->rear]=e;
}
element delete_front(DequeType* q) {
    if (is_empty_deque(q)) {
        error("EMPTY DEQUE");
    }
    q->front=(q->front+1)%MAX_SIZE;
    return q->data[q->front];
}
element delete_rear(DequeType* q) {
    if (is_empty_deque(q)) {
        error("EMPTY DEQUE");
    }
    q->rear=(q->rear-1+MAX_SIZE)%MAX_SIZE;
    return q->data[q->rear];
}
int getSize(DequeType* q) {
    if (is_empty_deque(q)) {
        return 0;
    }
    return (q->rear-q->front+MAX_SIZE)%MAX_SIZE;
}

void print_deque(DequeType* q) {
    if (is_empty_deque(q)) {
        error("EMPTY DEQUE");
        return;
    }
    for (int i = q->front+1; i != (q->rear+1)%MAX_SIZE; i = (i+1)%MAX_SIZE) {
        printf("%c ", q->data[i]);
    }
}
int palindromeCheck(DequeType* q) {
    while (getSize(q) > 1) {  // 남은 요소가 1개 이상일 때 계속 반복
        char cf = delete_front(q);
        char cr = delete_rear(q);
        if (cf != cr) {
            return 0;  // 대칭이 아닌 경우
        }
    }
    return 1;  // 대칭인 경우
}
int main(void) {
    printf("문자열을 입력하시오: ");
    char input[MAX_SIZE];
    fgets(input, MAX_SIZE, stdin);
    DequeType q;
    init_deque(&q);

    for (int i = 0; i < strlen(input); i++) {
        if(input[i] >= 'a' && input[i] <= 'z') {
            char tmp = input[i] - 32;
            add_rear(&q,tmp);
        }
        else if(input[i]>='A' && input[i]<='Z') {
            char tmp= input[i];
            add_rear(&q,tmp);
        }
        else if(input[i]==' '||input[i]==','||input[i]=='\''||input[i]=='.'||input[i]=='"') {
            continue;
        }
    }
    print_deque(&q);
    if(palindromeCheck(&q)) {
        printf("palindrome\n");
    }else {
        printf("not palindrome\n");
    }


    return 0;
}

 

'DSA' 카테고리의 다른 글

연결리스트 (LinkedList) 활용 2  (0) 2024.10.29
리스트 2(Linked List)  (0) 2024.10.28
회문(Palindrome) 검사 (스택)  (1) 2024.10.27
스택 2개를 이용한 선형 큐의 구현  (0) 2024.10.25
다항식 계산기 (Polynomial Calculator)  (0) 2024.10.02