728x90
Stack
목차
Stack의 기본 개념
- 입력과 출력을 한 방향으로 제한한 자료 구조
- 바닥부터 데이터를 Stacking(쌓는) 느낌으로 접근
- push : 데이터에 순서를 적용해 차례로 저장
- pop : 가장 최신 데이터부터 차례로 가져온다.
Stack |
---|
data |
data |
data |
data |
위와 같은 방식을 LIFO (Last In First Out)라고 한다.
스택의 구조체
C
typedef struct _NODE {
int Data;
struct _NODE *Next;
}NODE;
Java
class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
JavaScript
class Node {
constrcutor(data) {
this.data = data;
this.next = null;
}
}
Push / Pop
: ## 굵은 글씨가 현재 Top ##
-
Push 0
st1 data0 -
Push 1
st1 data1 data0 -
Pop (get data1)
st1 data0
링크드 리스트를 사용한 스택 알고리즘
C
#include <stdio.h>
#include <stdlib.h>
typdef struct _Node {
int Data;
struct _Node *Next;
}Node;
// 스택의 하위 자료구조용 노드
NODE *head, *end;
NODE *ptrNode;
void InitiazizeStack(void); //스택 함수 초기화
void Push(int); // 데이터 삽입
int Pop(void); // 데이터 삭제
void DisplayStack(void); // Display Stack
// 스택 초기화
void InitalizeStack(void) {
head = (NODE *)malloc(sizeof(NODE));
end = (NODE *)malloc(sizeof(NODE));
head->Next=end;
end->Next=end;
}
void Push(int data) {
ptrNode = (NODE *)malloc(sizeof(NODE));
ptrNode->Data = data;
ptrNode->Next = head->Next;
head->Next = ptrNode;
}
int Pop(void) {
int ret;
ptrNode = head->Next;
head->Next = head->Next->Next;
ret = ptrNode->Data;
free(ptrNode);
}
void DisplayStack(void) {
NODE *indexNode;
printf("head -> ");
for(indexNode = head->Next; indexNode != end; indexNode = indexNode->Next) {
printf("%d -> ", indexNode->Data);
}
printf("end");
}
void main() {
int ret;
InitializeStack();
Push(1);
Push(3);
Push(10);
PusH(20);
Push(12);
printf("다섯 번의 Push() 함수 호출 실행 결과\n");
DisplayStack();
ret = Pop();
ret = Pop();
ret = Pop();
printf("\n세 번의 Pop() 함수 호출 후 실행 결과\n");
DisplayStack();
}
// 다섯 번의 Push() 함수 호출 실행 결과
// head -> 12 - > 20 -> 10 -> 3 -> 1 -> end
// 세 번의 Pop() 함수 호출 실행 결과
// head -> 3 -> 1 -> end
Java
class Stack {
static class Node {
int data;
Stack next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
static Node head, end;
static Node ptrNode;
public static void initializeStack() {
head = new Node(-1);
end = new Node(-1);
head.next = end;
end.next = end;
}
public static void push(int data) {
ptrNode = new Node(data);
ptrNode.next = head.next;
head.next = ptrNode;
}
public static int pop() {
int ret = -1;
ptrNode = head.next;
ret = ptrNode.data;
head.next = head.next.next;
return ret;
}
public static void displayStack() {
Node indexPtr;
for(indexPtr = head.next; indexPtr != end; indexPtr = indexPtr.next) {
System.out.print(String.format("%d -> ", indexPtr.data));
}
System.out.println();
}
public static void main(String[] args) {
int ret;
initializeStack();
push(1);
push(3);
push(10);
push(20);
push(12);
displayStack();
ret = pop();
ret = pop();
ret = pop();
displayStack();
}
}
// 결과
// 12 -> 20 -> 10 -> 3 -> 1
// 3 -> 1
JavaScript
class Stack {
constructor(data) {
this.data = data;
this.next = null;
}
}
let head, end;
let ptrNode;
const initializeStack = () => {
head = new Stack(-1);
end = new Stack(-1);
head.next = end;
end.next = end;
}
const push = (data) => {
ptrNode = new Stack(data);
ptrNode.next = head.next;
head.next = ptrNode;
}
const pop = () => {
let ret = -1;
ptrNode = head.next;
ret = ptrNode.data;
head.next = head.next.next;
return ret;
}
const displayStack = () => {
let indexPtr;
let str = "";
for(indexPtr = head.next; indexPtr != end; indexPtr = indexPtr.next) {
str += `${indexPtr.data} ->`;
}
console.log(str);
}
const main = () => {
let ret;
initializeStack();
push(1);
push(3);
push(10);
push(20);
push(12);
displayStack();
ret = pop();
ret = pop();
ret = pop();
displayStack();
}
main();
// 결과
// 12 -> 20 -> 10 -> 3 -> 1
// 3 -> 1
'Algorithm > basic' 카테고리의 다른 글
알고리즘 기초 6 - [자료구조, 덱] (0) | 2021.03.09 |
---|---|
알고리즘 기초 5 - [자료구조, 큐] (0) | 2021.03.09 |
알고리즘 기초 3 - [자료구조, 이중링크드리스트, 삽입(검색), 삭제(검색)] (0) | 2021.03.08 |
알고리즘 기초 2 - [자료구조, 단일링크드리스트(삽입, 삭제, 검색)] (0) | 2021.03.08 |
알고리즘 기초 - 1 [알고리즘 정의, 평가, 분석, 빅오 표기법] (0) | 2021.02.19 |