- Push: 스택에 data 추가
- Pop: 스택에 data 삭제
- is_empty, is_full: 스택의 공백/포화 상태 검사
- peek: 요소를 삭제하지 않고 보기만 함
- 1차원 배열 stack[]
- top: 가장 최근 입력된 자료를 가리키는 top
- 가장 먼저 들어온 요소 = stack[0] || 가장 나중에 들어온 요소 = stack[top]
- 스택이 공백 상태인 경우: top = -1
프로그램 상에서 여러 Stack을 사용하지 않는 경우에 사용하는 방식
하지만 전역 변수로 구현하지 않는 것을 권장!
// 예시
#include<stdio.h>
#include<stdlib.h>
#define MAX_STACK_SIZE 100 //스택의 최대 크기
typedef int element; // 데이터의 자료형
element stack[MAX_STACK_SIZE];// 1차원 배열
int top = -1;
// 공백 상태 검출 함수
int is_empty(){ return (top==-1); }
// 포화 상태 검출 함수
int is_full(){return (top == (MAX_STACK_SIZE-1));}
// 삽입 함수
void push(element item){
if(is_full){
fprintf(stderr,"스택 포화 에러\n");
return;
}
else stack[++top] = item;
}
// 삭제 함수
element pop(){
if(is_empty()){
fpritnf(stderr,"스택 공백 에러\n");
exit(1);
}
else return stack[top--];
}
#include<stdio.h>
#include<stdlib.h>
#define MAX_STACK_SIZE 100 //스택의 최대 크기
typedef struct{
element data[MAX_STACK_SIZE];
int top;
}StackType;
// 스택 초기화 함수
void init_stack(StackType *s){ s->top =-1; }
// 공백 상태 검출 함수
int is_empty(StackType *s){ return (s->top==-1); }
// 포화 상태 검출 함수
int is_full(StackType *s){
return (s->top == (MAX_STACK_SIZE-1));
}
// 삽입 함수
void push(StackType *s, element item){
if(is_full(s)){
fprintf(stderr,"스택 포화 에러\n");
return;
}
else s->data[++(s->top)] = item;
}
// 삭제 함수
element pop(StackType *s){
if(is_empty(s)){
fpritnf(stderr,"스택 공백 에러\n");
exit(1);
}
else return s->data[(s->top)--];
}
malloc을 사용하여 실행시간에 메모리 할당을 받는다.
앞선 구조들은 컴파일 시간에 정적 메모리를 할당 받음!
typedef int element;
typedef struct{
element *data; // data는 포인터로 정의
int capacity; // 스택의 현재 크기
int top;
}StackType;
// 스택 생성
void init_stack(StackType *s){
s->top = -1;
s->capacity = 1; // 1개 요소 저장공간 확보
s->data = (element*)malloc(s->capacity * sizeof(element));
}
// 스택 삭제
void delete(StackType *s){ free(s); }
// 스택 삽입
void push(StackType *s, element item){
if(is_full(s)){ // 공간이 부족한 경우
s->capacity*=2; // 메모리 2배 확보
s->data = (element*)realloc(s->data, s->capacity*sizeof(element));
}
s->data[++(s->top)] = item;
}
하단의 문제 풀이 코드는 Github 참조!
스택 응용 문제 풀이 코드
1) 괄호 검사 문제
2) 후위 표기 수식의 계산
3) 중위 표기 수식을 후위 표기 수식으로 변환