2014-12-03 4 views
2

문자열이 스택을 사용하는 회문인지 확인하기 위해 다음 코드를 작성했습니다. 문자열에 두 개의 동일한 연속 문자가있을 때마다 정확한 출력을 얻지 못합니다. 예를 들어 코드에서는 exe이 회문입니다. 그러나 ee은 회문이 아닙니다.스택을 사용하여 문장 검색하기

int is_palindrome(char str[]) { 
    int j, top = -1; 
    char stk_item, s[30]; 

    for (j = 0; j < strlen(str); j++) 
    s[top++] = str[j]; 
    for (j = 0; j < strlen(str); j++) { 
    stk_item = s[--top]; 
    if (str[j] != stk_item) return 0; // is not a palindrome 
    } 

    return 1; // is a palindrome 
} 

어떤 문제 일 수 있습니까?

+1

스택 오버플로는 군중 기반의 디버거가 아닙니다. 도움이 될 수 있습니다. http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ –

답변

4

사전 증가 및 증가 증가 연산자를 혼동했습니다.

C에서 x++은 "이 명령문 다음에 x 값 증가"를 의미하고 ++x은 "처음으로 x 값을 증가시킨 다음 명령문을 실행합니다."를 의미합니다.

다음 코드는 작동합니다 : 모든

int is_palindrome(char str[]) { 
    int j, top = -1; 
    char stk_item, s[30]; 

    for (j = 0; j < strlen(str); j++) 
    s[++top] = str[j]; 
    for (j = 0; j < strlen(str); j++) { 
    stk_item = s[top--]; 
    if (str[j] != stk_item) return 0; 
    } 

    return 1; 
} 
3

먼저, 작업을 스택 마지막-에서 먼저 아웃 기술. 마지막으로 스택에 삽입하는 것이 가장 먼저 발생합니다.

는 기본적으로 (일반적으로 푸시라고도 함) 스택에 객체를 삽입하고 (일반적으로 팝업라고도 함) 스택에서 개체를 제거되는 스택에 당신이 할 수있는 두 가지가있다, 말하기.

푸시 기술에서는 사용 가능한 가장 낮은 빈 인덱스를 주어진 개체에 할당합니다. 그리고 따라서 그것은 s[++top] = str[j]이되어야합니다. 먼저 인덱스를 증가시킨 다음 오브젝트로 채우기 때.입니다.

팝업 기법에서는 채워진 최대 색인을 1 줄입니다. 따라서 stk_item = s[top--]이되어야합니다. 먼저 제거 된 개체가 top이라고 말한 다음 색인을 줄이십시오.