source

어레이를 통해 구현된 스택을 사용한 패러테제스 매칭.balanced()를 사용하여 스택이 비어 있는지 체크하기 위해 모든 '(')'에 대해 '(')를 누르고 '(')를 팝핑했습니다.

gigabyte 2022. 10. 30. 17:53
반응형

어레이를 통해 구현된 스택을 사용한 패러테제스 매칭.balanced()를 사용하여 스택이 비어 있는지 체크하기 위해 모든 '(')'에 대해 '(')를 누르고 '(')를 팝핑했습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stack {
    int size;
    int top;
    char *arr;
};

void push(struct stack *st,char x) {
    if (st->top >= st->size - 1) {
        printf("stack is full");
    }
    else {
        st->top++;
        st->arr[st->top] = x;
    }
}

char pop(struct stack *st) {
    char x;

    if (st->top < 0) {
        printf("stack is empty");
    }
    else {
        x = st->arr[st->top];
        st->top--;
    }

    return x;
}

int isempty(struct stack st) {
    if (st.top < 0) {
        return 1;
    }
    else
        return 0;
}

void display(struct stack st) {
    int i;
    for (i = st.top; i >= 0; i--) {
        printf("%c ", st.arr[i]);
    }

    printf("\n");
}

int balanced(char *expr) {
    int i;
    struct stack st;
    st.size = strlen(expr);
    st.top = -1;
    st.arr = (char *)malloc(st.size * sizeof(char));
    
    for (i = 0; expr[i] != '\0'; i++) {
        if (expr[i] = '(') {
            push(&st, expr[i]);
        }
        else if (expr[i] = ')') {
            if (st.top < 0) return false;
            else pop(&st);
        }
    }

    if (st.top < 0) return 1;
    else return 0;
}

int main() {
    char *expr = "((a+b))";
    printf("%d", balanced(expr));

    return 0;
}

c 프로그래밍의 배열에 구현된 스택을 사용한 패러테제스 매칭.balanced() 함수를 호출해도 출력되지 않습니다.위의 코드를 수정하려면 어떻게 해야 합니까?이 방법과는 별도로, 파라테시스 매칭을 체크하고 식이 유효한지 여부를 체크하는 다른 방법이 있다. 즉, (a+)b 이 파라테시스에서는 균형이 잡혀 있지만 식이 유효하지 않다.

이 루프에서는:

   for (i = 0; expr[i] != '\0'; i++) {
       if (expr[i] = '(') {
           push(&st, expr[i]);
       }
       else if (expr[i] = ')') {
           if (st.top < 0) return false;
           else pop(&st);
       }
   }

평등을 확인하는 것이 아니라 과제가 있습니다. =대.==.

첫 번째 조건은 항상 참이기 때문에 모든 캐릭터가 만들어집니다.'('스택에 밀어넣었습니다.스택에서 아무것도 터지지 않습니다.

또한 다음 항목을 포함해야 합니다.<stdbool.h>사용하고 싶다면true그리고.false.

이러한 문제를 수정하고 프로그램을 실행하면 다음과 같이 출력됩니다.1.

다른 사람들은assignment그랬어야 했는데test for equality.

스택을 사용하는 것은 흥미롭지만 단순히 0으로 초기화된 부호 있는 정수 카운터를 사용할 수도 있습니다.'('가 발견되면 증가하고 ''가 발견되면 감소합니다.카운터가 음수가 되거나 양의 최종값이 발견되면 괄호가 올바르게 쌍을 이루고 있지 않습니다.

세상은 괄호만 있는 것이 아니다.다음에서는 다른 (고정 크기!) 스택을 사용하여 둘러싸인 문자의 쌍을 대조합니다.네, 스택의 '푸시/팝'은 '네스팅'이 기대에 부응하도록 하는 편리한 방법입니다.

표현의 적법성을 확인하기 위해서는 몇 가지 문법 규칙에 따라 문법을 해석해야 한다.그것은 다소 더 복잡하다.

#include <stdio.h>
#include <stdbool.h>

int main() {
    char *str = "{(foo)({gib(bar)gab;}) ((())) []Quick brown fox ";

    char stack[ 64 ] = { 0 };
    int stkInd = 1;
    bool good = true;
    for( char *cp = str; *cp; cp++ ) {
        switch( *cp ) {
            case '(': stack[ stkInd++ ] = ')'; break;
            case '{': stack[ stkInd++ ] = '}'; break;
            case '[': stack[ stkInd++ ] = ']'; break;
            case '<': stack[ stkInd++ ] = '>'; break;

            case ')':
            case '}':
            case ']':
            case '>': good = *cp == stack[ --stkInd ]; break;
        }

        if(  stkInd >= sizeof stack ) {
            printf( "Stack Full!\n" );
            return -1;
        }

        if( !good ) {
            printf( "%s\n", str );
            printf( "%*s^---\n", cp - str, " " );
            printf( "Unmatched '%c'\n", *cp );
            return -1;
        }
    }

    while( stkInd > 1 ) {
        char c = stack[ --stkInd ];
        switch( c ) {
            case ')': c = '('; break;
            case '}': c = '{'; break;
            case ']': c = '['; break;
            case '>': c = '<'; break;
        }
        printf( "Unpairable %c\n", c );
    }

    return 0;
}

당신의 코드를 다시 보니isempty( )그리고.display( )둘 다 스택에 대한 포인터가 아니라 스택의 복사본을 처리하기 때문에 문제가 발생할 수 있습니다.스택의 치수는 원래 문자열의 길이와 일치하기 때문에 불필요한 것으로 간주될 수 있습니다.스택의 주소를 전달하고 포인터를 사용하는 것이 더 효율적입니다.

언급URL : https://stackoverflow.com/questions/73595409/paranthesis-matching-using-stack-implemented-through-array-i-used-balanced-to

반응형