[자료구조 - C언어] 자료구조 제15강: 스택(Stack) 개념과 구현(2)
2022. 11. 10. 01:22ㆍCS/자료구조
728x90
//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎
1. 배열을 이용한 스택의 구현
//stack.c
#define MAX_CAPACITY 100
int is_full();
//문자들을 저장하는 스택
//스택에 저장되는 데이터의 타입을 문자(char)라고 가정
char stack[MAX_CAPACITY];
//스택의 top을 표시하는 변수 ~ 스택의 어디까지 데이터가 차 있다를 표시
int top = -1; //-1은 실제 스택 데이터의 위치를 반영
//새로운 데이터를 추가 함수
void push(char ch){
if(is_full()) //스택이 가득차면 push할 수 없다.
return;
top++;
stack[top]=ch;
//만약 int top=0;으로 시작하면 아래와 같은 순서로 구현
//stack[top]=ch;
//top++;
}
int is_full(){
return top==MAX_CAPACITY-1; //배열은 0부터 시작
}
//스택의 top에 있는 값 삭제 후 반환 함수
char pop(){
if(is_empty()) //스택이 비어있지 않을 때만 동작
return NULL;
char tmp = stack[top];
top--;
return tmp;
}
//스택의 top에 있는 값 리턴 함수
char peek(){
//peek을 호출하기 전에 먼저 empty인지 검사해야 한다.
return stack[top];
}
char is_empty(){
return top==-1; //top이 -1인지
}
2. 연결 리스트를 이용한 스택의 구현
- 연결 리스트의 맨 앞이 노드를 삽입/삭제하기에 편하다 → 맨 앞을 stack의 top으로 한다.
- 단방향 연결 리스트에서 노드를 삭제할 때 이전 노드의 주소가 필요하다.
- 맨 마지막이 top이라면 삭제 시 그 앞의 노드의 주소가 필요한데
- 이는 곧 전체 노드를 순회한다는 의미와 동일
- 맨 마지막이 top이라면 삭제 시 그 앞의 노드의 주소가 필요한데
- add_first → push 역할
- remove_first → pop 역할
- 단방향 연결 리스트에서 노드를 삭제할 때 이전 노드의 주소가 필요하다.
2-1. 노드 구조
struct node{
char *data;
struct node *next;
};
typedef struct node Node;
Node *top = NULL;
2-2. 스택 구현
//stack.c
#include <stdio.h>
#include <stdlib.h>
int is_empty();
struct node{
char *data;
struct node *next;
};
typedef struct node Node;
Node *top = NULL;
//연결리스트로 보자면 add_first()와 동일
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;
Node *p = top;
char *result = p->data; //top 노드에 저장되어 있는 데이터를 임시 보호
top = p->next; //top 한 칸 전진
free(p);
return result;
}
char *peek(){
if(is_empty())
return NULL;
return top->data;
}
int is_empty(){
return top==NULL;
}
3. 문제점
- 만약 스택이 동시에 2개 이상 필요하다면?
- 같은 로직이지만 이름이 다른 변수
char stack1[]; int top1 = -1; void push1(char *ch); char *pop1(); ... char stack2[]; int top2 = -1; void push2(char *ch); char *pop2(); ...
- 서로 다른 타입의 데이터를 저장할 스택이 필요하다면?
부경대학교 권오흠 교수님의 [c로 배우는 자료구조 및 여러 가지 예제 실습] 강의 정리입니다. 감사합니다.
https://www.youtube.com/watch?v=Vj_JOmL1nyE&t=1109s
728x90
'CS > 자료구조' 카테고리의 다른 글
[자료구조 - C언어] 자료구조 제16강: 스택의 응용 - 후위표기식(1) (0) | 2022.11.11 |
---|---|
[자료구조 - C언어] 자료구조 제15강: 스택(Stack) 개념과 구현(3) (0) | 2022.11.10 |
[자료구조 - C언어] 자료구조 제15강: 스택(Stack) 개념과 구현(1) (0) | 2022.11.10 |
[자료구조 - C언어] 자료구조 [11강-14강] 복습 및 정리 (0) | 2022.11.09 |
[자료구조 - C언어] 자료구조 제14강: Music Library Program(10) (0) | 2022.11.08 |