Stack의 개념과 구현Language/자료구조2021. 12. 6. 14:30
Table of Contents
< Stack >
- 일종의 리스트
- 단, 데이터의 삽입과 삭제가 한쪽 끝에서만 이루어짐
- LIFO( Last-In, First-Out )
- 삽입/삭제가 일어나는 쪽을 스택의 top이라고 부른다.
< Stack의 연산 >
- push : 스택에 새로운 원소를 삽입하는 연산
- pop : 스택의 top에 있는 원소를 스택에서 제거하고 반환
- peek : 스택 top의 원소를 제거하지 않고 반환
- empty : 스택이 비었는지 검사
< 스택 응용 예 : 괄호 검사 문제 >
- 입력 수식의 괄호가 올바른지 검사
예) [a+b*{c/(d-e)}] + (d/e)
- 단순히 여는 괄호와 닫느 괄호의 개수 비교 만으로는 부족
- 스택을 이용하여 검사
- 여는 괄는 스택에 push
- 닫는 괄호가 나오면 스택에서 pop한 후, 두괄호가 같은 유형이어야
- 마지막에 스택에 남는 괄호가 없어야
< 배열을 이용한 Stack 구현 >
#include "stack.h"
#define MAX_CAPACITY 100
char stack[MAX_CAPACITY];
int top = -1;
void push(char ch) {
if (is_full()) {
return;
}
top++;
stack[top] = ch;
}
char pop() {
if (is_empty()) {
return;
}
char tmp = stack[top];
top--;
return tmp;
}
char peek() {
return stack[top];
}
int is_empty() {
return top == -1;
}
int is_full() {
return top == MAX_CAPACITY - 1;
}
< 연결리스트로 구현 >
struct node {
char* data; // 문자열들을 저장하는 스택이라고 가정.
struct node next;
};
typedef struct node Node;
Node* top = NULL;
void push(char* item) {
Node* p = (Node*)malloc(sizeof(Node));
p->data = item;
p->next = top;
top = p;
}
char* pop() {
if (is_empty())
return NULL;
char* result = top->data;
top = top->next;
return result;
}
char* peek() {
if (is_empty())
return NULL;
return top->data;
}
int is_empty() {
return top == NULL;
}
'Language > 자료구조' 카테고리의 다른 글
[16] C review < 이중연결리스트 Music Library Program 기본동작들 > (0) | 2021.11.29 |
---|---|
[15] C review < 이중연결리스트 > 과제 수정 필요 (0) | 2021.11.29 |
[14] C review < 연결리스트 - 다항식 > (0) | 2021.11.27 |
[13] C review < 연결리스트의 순회 > (0) | 2021.11.26 |
[12] C review < 연결리스트의 제거 > (0) | 2021.11.26 |
@Return :: Return
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!