<Stack 자료구조>
Stack: 가장 최근에 들어온 데이터가 가장 먼저 나감
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 100
typedef char element; // char 은 int 등으로 대체 가능
typedef struct {
element data[MAX_STACK_SIZE];
int top;
} StackType; // 스택 구조체 정의
void init_stack(StackType* s) {
s->top = -1;
} // 스택 초기화 함수 (구조체 포인터의 멤버는 s->이런식)
int is_empty(StackType* s) {
return (s->top == -1);
}// 스택 비었는지 검사하는 함수, 빈 상태 return
int is_full(StackType* s) {
return (s->top == (MAX_STACK_SIZE - 1));
}// 스택 꽉 찼는지 검사하는 함수, 꽉 찬 상태 return
void push(StackType* s, element item) {
if (is_full(s)) {
fprintf(stderr, "스택 포화 에러\n");
return;
}// 스택 꽉 찼으면 에러 return
else s->data[++(s->top)] = item;
}// 스택+1 하고 집어넣기
element pop(StackType* s) {
if (is_empty(s)) {
fprintf(stderr, "스택 공백 에러\n");
exit(1);
}// 스택 비었으면 에러 return
else return s->data[(s->top)--];
}// 스택에서 꺼내고 -1하기
element peek(StackType* s) {
if (is_empty(s)) {
fprintf(stderr, "스택 공백 에러\n");
exit(1);
}
else return s->data[(s->top)];
}
<괄호 검사 알고리즘>
int check_matching(const char* in) {
StackType s;//스택 선언
char ch, open_ch;
int n = strlen(in);//n = 받은 문자열의 길이
int i = 0;
init_stack(&s);//스택 초기화
for (i = 0; i < n; i++) {
ch = in[i];//스택[0]에 문자열 0번째 저장
switch (ch) {
case '(': case '[': case'{':
push(&s, ch);
break;
case ')': case ']': case '}':
if (is_empty(&s)) return 0;
else {
open_ch = pop(&s);
if ((open_ch == '(' && ch != ')') || (open_ch == '[' && ch != ']') || (open_ch == '{' && ch != '}')) {
return 0;
}
break;
}
}
}
if (!is_empty(&s)) return 0;
return 1;
}
int main(void) {
char* p = "{A[(i+1)}{{}}}}]]]=0;}";
if (check_matching(p) == 1)
printf("%s 괄호 검사 성공\n", p);
else
printf("%s 괄호 검사 실패\n", p);
return 0;
}
- 문자열은 char * pointer = "happy" 에 저장
- 포인터에 넘길 때만 &pointer(주소)로 사용하고 나머지는 배열 이름마냥 pointer로 쓴다
'개발 > C' 카테고리의 다른 글
[C] 자료구조 - 선형 Queue (1) | 2022.10.11 |
---|---|
[C] 함수의 매개변수가 구조체 포인터일 때, &붙여야 할까? (0) | 2022.10.11 |
[C] 포인터가 함수의 매개변수일 때 어떻게 값을 넘길 것인가? (1) | 2022.10.11 |
[C] 문자열의 원소(char)를 정수(int)로 바꾸기 (0) | 2022.10.09 |
[C] 문자 배열과 문자 포인터(문자열)의 차이 (0) | 2022.10.07 |
댓글