- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 배열
- Java
- 안드로이드 스튜디오
- til
- C언어
- 프로그래머스
- 알고리즘
- 연결리스트
- 컴퓨터공학과
- oauth
- 공유대학
- sql
- 자바
- 로그인
- 정렬
- 동적할당
- 안드로이드
- 코딩테스트
- 자료구조
- firebase google
- 비주얼 베이직
- Firebase
- android studio
- 파이썬
- python
- 프로그래밍 입문
- 백준
- 구글 로그인
- C++
Archives
코딩하는 해달이
[자료구조] 스택(Stack)이란? 본문
연결리스트를 배우면서 연결리스트로 구현한 스택에 대해서도 배워서, 직접 연결리스트로 스택을 구현해보려고 하던 중에 그냥 스택에 대해서도 블로그에 써 놓는게 더 도움이 될 것 같아서 스택부터 정리한 후 아래에 연결리스트로 스택을 구현해 보아야겠다.
스택이란?
스택은 기본적으로 후입선출(Last In First Out)을 기반으로 한 선형 구조이다.
이런 구조는 한쪽 끝에서만 자료의 출입이 이루어지기 때문에 기본적으로 push() 와 pop()연산이 필수적으로 필요하다.
여기서 push()는 '데이터를 밀어 넣는다'는 개념으로 데이터를 추가하는 입력 연산이고,
pop()은 자료가 튀어나오는 것을 의미하여 출력 연산을 지칭한다.
그 외에도 조회 연산인 peek가 있는데 이 연산은 가장 마지막으로 들어간 데이터를 반환하며 삭제하지않는다.
아래의 그림은 연결리스트의 노드로 스택을 구현한 형태를 그림으로 나타낸 것이다.
이제 C언어를 이용해 연결리스트로 스택를 구현해보자.
간단하게 삽입, 삭제, 크기, 마지막 데이터를 반환, 첫 데이터를 반환하는 기능들을 구현해 보았다.
#include <stdio.h>
#include <stdlib.h>
typedef int Element; //데이터 별명
typedef struct LinkNode { //노드 생성
Element data;
struct LinkNode* link; //노드의 주소값을 저장 (*구조체의 자기참조)
} node;
node* top = NULL; //스택의 top 선언
void push(Element e) { //삽입연산을 하는 함수
if (top == NULL) { //데이터를 스택에 처음 삽입할 때
top = (node*)malloc(sizeof(node));
if (top != NULL) {
top->data = e;
top->link = NULL;
}
}
else { //이미 스택안에 데이터가 있을 때
node* obj = (node*)malloc(sizeof(node));
if (obj != NULL) {
obj->data = e;
obj->link = top; //새로 만든 노드에 이전 데이터 주소 삽입
top = obj; //top 새로 지정
}
}
}
Element pop() { //출력 연산을 하는 함수
Element e = top->data;
node* obj = top->link;
free(top);
top = obj;
return e;
}
int size() { //스택의 크기를 구하는 함수
int cnt = 0;
node* curr = top;
while (curr != NULL) {
cnt++;
curr = curr->link;
}
return cnt;
}
Element peek() { //스택의 마지막 데이터 반환 함수
return top->data;
}
Element front() { //스택의 가장 앞의 데이터 반환 함수
node* curr = top;
while (curr->link != NULL) {
curr = curr->link;
}
return curr->data;
}
int main() {
printf("size() = %d ", size());
push(1);
printf("size() = %d ", size());
push(2);
printf("size() = %d \n", size());
push(3);
printf("back() = %d ", peek());
printf("front() = %d ", front());
printf("size() = %d ", size());
printf("pop() = %d\n", pop());
printf("size() = %d ", size());
printf("pop() = %d\n", pop());
printf("size() = %d ", size());
printf("pop() = %d\n", pop());
return 0;
}
반응형
'개인 공부 > 알고리즘&자료구조' 카테고리의 다른 글
[자료구조] 자료구조 수업 과제 2 (0) | 2022.11.19 |
---|---|
[자료구조] 자료구조 수업 과제 1 (0) | 2022.11.19 |
[자료구조] 연결 리스트(Linked List)란? (2) | 2022.11.08 |
[알고리즘] 유클리드 호제법 (0) | 2022.07.26 |
[알고리즘] 에라토스테네스의 체 (0) | 2022.07.26 |
Comments