Stack

gksrudtlr
|2025. 4. 23. 01:53

Stack

  • Stack이란?
    • LIFO: Last In First Out
    • top(top of pointer)를 활용하여 구현되며, stack이 비어있다면 top의 값은 -1로 되어있다
    • 후입 선출로 값을 뒤집어야 하는 상황에서 사용한다
    • 재귀 함수, 명령을 내렸다 취소(ctrl z, ctrl y), 함수나 클래스의 스택 프레임, 지역변수 등에서 사용할 수 있다
    • 스택프레임: 함수를 스택 영역에 차례대로 저장되는 함수의 호출 정보
    • 콜스택: 함수를 콜하면서 생긴 스택
    • Caller: 함수 A에서 생성된 스택프레임
    • Callee: 함수 B에서 생성된 스택프레임
    • 스택 프레임을 살펴보면 호출한 함수인 B의 return될 주소-> 파라미터 값 a, Jump뛸 주소 B순으로 Callee에 스택 프레임이 만들어지고, Jump뛸 주소를 꺼내 Jump를 뛴 뒤 a값을 꺼낸 뒤 b에 저장한 뒤 스택에 담는다
    • 그 후 c변수에 b값을 넣고 c역시 스택에 담고, return을 만나 복사생성자에 의해 c 값을 복사해 따로 들고있는다
    • }를 만나 c,b순으로 스택에서 꺼내고, return될 주소를 꺼내면서 복사된 c값을 담아 넘겨주면 B(a)가 c의 값으로 대채될 수 있는 것이다
  • 구현
#pragma once
#include <memory.h>
#include <assert.h>

#define MAX_STACK_COUNT 20

template<typename T>
class Stack
{
public:
	Stack()
	{
		memset(values, 0, sizeof(T) * MAX_STACK_COUNT);
	}

	void Push(T value)
	{
		assert(top + 1 < MAX_STACK_COUNT);

		values[++top] = value;
	}

	T Pop()
	{
		bool b = Empty();
		assert(b == false);//정의로 가보면 assert 가 NDEBUG 상황(Release모드)일땐 void(0)으로 assert를 채크하지 않는다
		if (b == true)
			return -1;

		T val = values[top--];

		return val;
	}

	T Front()
	{
		return values[top];
	}

	T Back()
	{
		assert(top > -1);
		if (top <= -1)
			return -1;

		return values[0];
	}

	bool Empty()
	{
		return top < 0 ? true : false;
	}
private:
	int top = -1;

	T values[MAX_STACK_COUNT];
};

#include <iostream>
#include "Stack.h"

int main()
{
	Stack<int> stack{};

	stack.Push(10);
	stack.Push(20);
	stack.Push(30);

	stack.Pop();
	stack.Push(40);
	stack.Push(50);

	while (stack.Empty() == false)
		printf("%d\n", stack.Pop());
	return 0;
}

 

 

'자료구조 > 자료구조 정리' 카테고리의 다른 글

이중 연결 리스트  (0) 2025.04.08
연결리스트  (0) 2025.03.25
템플릿  (0) 2025.03.25
선형, 비선형 자료구조  (0) 2025.03.18