728x90
반응형
코딩에는 크게 두가지의 단계가 있다고 생각합니다.
크게 첫번째는 그 언어의 문법(예를 들어 if문이나 for문 등등)을 원하는 때에 적재적소로 사용할 수 있는 단계!
두번째는 자료구조와 알고리즘을 이용해 더 어려운 문제를 풀기 위한 발판을 만드는 단계!
이글은 두번째 단계의 시작인 사람(저도 포함입니다 ㅎㅎ)들을 위해서 작성했습니다 ㅎㅎ
스택(stack) 부터 시작해보시죠!!
스택 구현(stack)
단계 나누기
1. 구조체 및 변수 선언
2. 스택 초기화 함수(init_stack)
3. 공백 상태 검출 함수(is_empty)
4. 포화상태 검출 함수(is_full)
5. 삽입함수(push)
6. 삭제함수(pop)
7. 엿보기함수(peek)
1. 구조체 및 변수 선언
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
#define MAX_SIZE_STACK 100 // MAX_SIZE_STACK는 100 이라고 선언
typedef char element; // char 를 이제부터 element라고 선언
typedef struct {
element data[MAX_SIZE_STACK]; // char data[100];
int top; // LIFO 방식의 스택의 현재 가장 최근에 들어온 data의 인덱스
} StackType; //구조체를 이제 StackType으로 접근하기로 선언
2. 스택 초기화 함수(init_stack)
void init_stack(StackType* s) { //StackType 구조체 포인터를 매개변수 s로 받겠다는 뜻
s->top = -1; // 기본적으로 -1을 가르키라는 뜻
}
3. 공백 상태 검출 함수(is_empty)
int is_empty(StackType* s) {
return (s->top == -1);
}
4. 포화상태 검출 함수(is_full)
int is_full(StackType* s) {
return (s->top == (MAX_SIZE_STACK - 1)); //배열 data의 꼭대기에 top이 있다면 포화상태라는 뜻
}
5. 삽입함수(push)
void push(StackType* s, element item) { // char item을 하나 추가로 매개변수를 받음
if (is_full(s)) {
fprintf(stderr, "포화상태\n"); // 삽입하려 했는데 포화상태라면 '포화상태'라고 출력
return;
}
else s->data[++(s->top)] = item; // 포화상태가 아니라면 data의 top+1번째 인덱스에 item을 삽입
}
6. 삭제함수(pop)
element pop(StackType* s) {
if (is_empty(s)) {
fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
exit(1); //프로그램 종료
}
else return s->data[(s->top)--]; // data의 top번째 인덱스의 값을 리턴하고 top값을 -1 함
}
7. 엿보기함수(peek)
element peek(StackType* s) {
if (is_empty(s)) {
fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
exit(1); //프로그램 종료
}
else return s->data[(s->top)]; // data의 top번째 인덱스의 값을 리턴
}
8. 스택(stack) 함수 전체 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
#define MAX_SIZE_STACK 100 // MAX_SIZE_STACK는 100 이라고 선언
typedef char element; // char 를 이제부터 element라고 선언
typedef struct {
element data[MAX_SIZE_STACK]; // char data[100];
int top; // LIFO 방식의 스택의 현재 가장 최근에 들어온 data의 인덱스
} StackType;
void init_stack(StackType* s) { //StackType 구조체 포인터를 매개변수 s로 받겠다는 뜻
s->top = -1; // 기본적으로 -1을 가르키라는 뜻
}
int is_empty(StackType* s) {
return (s->top == -1);
}
int is_full(StackType* s) {
return (s->top == (MAX_SIZE_STACK - 1));
}
void push(StackType* s, element item) { // char item을 하나 추가로 매개변수를 받음
if (is_full(s)) {
fprintf(stderr, "포화상태\n"); // 삽입하려 했는데 포화상태라면 '포화상태'라고 출력
return;
}
else s->data[++(s->top)] = item; // 포화상태가 아니라면 data의 top+1번째 인덱스에 item을 삽입
}
element pop(StackType* s) {
if (is_empty(s)) {
fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
exit(1); //프로그램 종료
}
else return s->data[(s->top)--]; // data의 top번째 인덱스의 값을 리턴하고 top값을 -1 함
}
element peek(StackType* s) {
if (is_empty(s)) {
fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
exit(1); //프로그램 종료
}
else return s->data[(s->top)]; // data의 top번째 인덱스의 값을 리턴
}
9. 스택(stack) 함수 눈에 보이게 출력하는 main 함수
int main() {
StackType stack;
init_stack(&stack); // 스택 초기화
// A, B, C를 스택에 push
push(&stack, 'A');
push(&stack, 'B');
push(&stack, 'C');
printf("스택에서 꺼낸 문자열: ");
// 스택이 빌 때까지 스택에서 문자를 꺼내서 출력
while (!is_empty(&stack)) {
printf("%c ", pop(&stack));
}
printf("\n");
return 0;
}
스택(stack) 함수(최종 코드)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
#define MAX_SIZE_STACK 100 // MAX_SIZE_STACK는 100 이라고 선언
typedef char element; // char 를 이제부터 element라고 선언
typedef struct {
element data[MAX_SIZE_STACK]; // char data[100];
int top; // LIFO 방식의 스택의 현재 가장 최근에 들어온 data의 인덱스
} StackType;
void init_stack(StackType* s) { //StackType 구조체 포인터를 매개변수 s로 받겠다는 뜻
s->top = -1; // 기본적으로 -1을 가르키라는 뜻
}
int is_empty(StackType* s) {
return (s->top == -1);
}
int is_full(StackType* s) {
return (s->top == (MAX_SIZE_STACK - 1));
}
void push(StackType* s, element item) { // char item을 하나 추가로 매개변수를 받음
if (is_full(s)) {
fprintf(stderr, "포화상태\n"); // 삽입하려 했는데 포화상태라면 '포화상태'라고 출력
return;
}
else s->data[++(s->top)] = item; // 포화상태가 아니라면 data의 top+1번째 인덱스에 item을 삽입
}
element pop(StackType* s) {
if (is_empty(s)) {
fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
exit(1); //프로그램 종료
}
else return s->data[(s->top)--]; // data의 top번째 인덱스의 값을 리턴하고 top값을 -1 함
}
element peek(StackType* s) {
if (is_empty(s)) {
fprintf(stderr, "공백상태\n"); // 삽입하려 했는데 공백상태라면 '공백상태'라고 출력
exit(1); //프로그램 종료
}
else return s->data[(s->top)]; // data의 top번째 인덱스의 값을 리턴
}
int main() {
StackType stack;
init_stack(&stack); // 스택 초기화
// A, B, C를 스택에 push
push(&stack, 'A');
push(&stack, 'B');
push(&stack, 'C');
printf("스택에서 꺼낸 문자열: ");
// 스택이 빌 때까지 스택에서 문자를 꺼내서 출력
while (!is_empty(&stack)) {
printf("%c ", pop(&stack));
}
printf("\n");
return 0;
}
반응형
'코딩 > 코딩 꿀팁' 카테고리의 다른 글
float를 출력할때 뒤의 0을 제거하고 출력하고 싶다면? (0) | 2024.03.10 |
---|---|
[파이썬 / Python] 문자열 관련 함수 총 정리 (계속 수정 예정!!) (0) | 2024.02.06 |
[파이썬 / Python] map(int, input().split()) 에 대하여 (0) | 2024.02.01 |
코딩 시작할 때 이것만은 알고가자! : 아스키코드 (0) | 2024.02.01 |
코딩 시작할 때 이것만 알고 가자!! : VS 단축키 편!! (1) | 2024.02.01 |