어레이를 통해 구현된 스택을 사용한 패러테제스 매칭.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
'source' 카테고리의 다른 글
테이블 nestj 자동 생성에 대한 TypeORM 요청 (0) | 2022.10.30 |
---|---|
PHP 7의 <=>('Spaceship' 연산자)란 무엇입니까? (0) | 2022.10.30 |
MySQL에서 SELECT DISTINT와 GROUP BY 중 어느 쪽이 빠릅니까? (0) | 2022.10.30 |
React 함수/Hooks 컴포넌트에 componentDismount가 동등합니까? (0) | 2022.10.30 |
Vue 3 - app.config가 정의되지 않았습니다.이 오류를 회피하는 방법 (0) | 2022.10.30 |