record logo record

스택(Stack) 이란?

스택(Stack)의 용도

  1. 함수의 호출의 순서 제어(콜스택)
  2. 문자열 역순으로 출력
  3. 연산자 후위표기법
  4. 인터럽트가 발생하여 복귀주소를 저장할 때
  5. 주소지정방식 명령어의 자료 저장소
  6. 재귀(Recursive) 프로그램의 순서를 제어
  7. 컴파일러를 이용해 언어 번역

스택(Stack) 특징

스택(Stack)의 성질

스택(Stack)의 알고리즘 예시

C 언어를 이용한 Stack 구현

#include <stdio.h>
#include <stdlib.h>

// 노드 생성 
typedef struct Node {
	int data;
	Node *next;
} Node;

// top 노드 
typedef struct top {
	Node *top;
} Stack;


void push(Stack *s, int data) {
	Node *node = (Node*)malloc(sizeof(Node));
	node->data = data;
	node->next = s->top;
	s->top = node;
}

int pop(Stack *s) {
	if(s->top == NULL) {
		printf("UnderFlow\n");
		return -1;
	}
	Node *node = s->top;
	int data = node->data;
	s->top = node->next;
	free(node);
	return data;
}
void show(Stack *s) {
	printf("----show----\n");
	Node *node = s->top;
	while(node != NULL) {
		printf("%d\n",node->data);
		node=node->next;
	}
}

int main(void) {
	Stack s;
	s.top = NULL;
	push(&s,3);
	push(&s,2);
	push(&s,1);
	push(&s,4);
	push(&s,5);
	push(&s,6);
	show(&s);
	pop(&s);
	show(&s);
	return 0;
}

Java 언어를 이용한 Stack 구현

public class mystack {
	public static class Node {
		private Object data;
		private Node next;
		
		public Node(Object data) {
			this.data = data;
			this.next = null;
		}
		
	}
	private Node top;
	
	public void push(Object data) {
		Node node = new Node(data);
		node.next = top;
		top = node;
	}
	
	public Object pop() {
		if(top == null) {
			System.out.println("UnderFlow");
		}
		Object data = top.data;
		top = top.next;
		
		return data;
	}
	public Object peak() {
		Object data = top.data;
		return data;
	}
	public void show() {
		System.out.println("----show----");
		Node node = top;
		while(node!=null) {
			System.out.println(node.data);
			node = node.next;
		}
	}
}

C++ 배열을 이용한 스택 구현

#include <iostream>
using namespace std;
#define ll long long

const int mx = 1000005;
int dat[mx];
int pos = 0;

void push(int x) { dat[pos++] = x; }
void pop() { pos--; }
int top() { return dat[pos-1]; }

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    push(1);
    push(2);
    push(3);

    cout << top(); // 3
    pop();
    cout << top(); // 2
    
    return 0;
}

C++ STL Library를 사용한 Stack 구현

#include <iostream>
#include <stack>
using namespace std;

int main(void){
	stack<int> s;
	
	s.push(8);
	s.push(5);
	s.push(2);
	s.pop();
	s.push(7);
	s.pop();
	while(!s.empty()){
		cout << s.top() << ' ';
		s.pop();
	}
	
	return 0;
}

스택의 활용(0x08) - 수식의 괄호 쌍이란?

올바르지 않은 괄호 쌍1

결론(올바르지 않은 괄호 문제 해결법)

References