본문 바로가기
자료구조

[자료구조] 2. 스택(stack), 큐(queue)

by 프링글's 2023. 1. 25.

1. 스택

데이터를일시적으로 저장하기 위한 자료구조

후입선출(LIFO, Last In First Out)

push: 데이터를 넣음

pop: 데이터를 꺼냄

top, bottom

함수 호출, 실행 시 스택 사용

스택 만들기

공부한 책은 C언어 기반이라 구조체로 구현했지만 우린 C++에서 클래스를 배웠으므로 C++로 다시 만들어보았다

#include <iostream>
using namespace std;

class stack {
private:
	int max;	//스택 용량
	int ptr;	//스택 데이터의 개수
	int* stk;	//스택 데이터를 넣을 배열(동적할당)
public:
	stack(int max) : ptr(0), max(max) {		//초기화
		stk = new int[max];
	}
	~stack() {
		delete[] stk;
		max = 0;
		ptr = 0;
	}
	int push(int x) {
		if (ptr >= max)	//스택이 가득참
			return -1;
		stk[ptr++] = x;
		return 0;
	}
	int pop(int* x) {
		if (ptr <= 0)	//스택이 비어있음
			return -1;
		*x = stk[--ptr];	//팝 데이터를 x값에 넘겨주고 ptr을 1줄임.
		return 0;
	}

	int peek(int* x) const {	//스택 꼭대기 값 보기(팝 아니고 그냥 확인만 하는거)
		if (ptr <= 0)
			return -1;
		*x = stk[ptr - 1];
		return 0;
	}

	void Clear() {
		ptr = 0;
	}

	int capacity() const {
		return max;
	}

	int size() const {
		return ptr;
	}

	bool IsEmpty() const {
		return ptr <= 0;
	}

	bool IsFull() const {
		return ptr >= max;
	}

	int search(int x) const {
		for (int i = ptr - 1; i >= 0; i--) {
			if (stk[i] == x)
				return i;
		}
		return -1;
	}

	void print() const {
		for (int i = 0; i < ptr; i++) {
			cout << stk[i] << ' ';
		}
		cout << endl;
	}
};

2. 큐

스택과 마찬가지로 데이터를 일시적으로 쌓아두기 위한 자료구조

선입선출(FIFO, First In First Out)

enqueue: 데이터 넣기

dequeue: 데이터 빼기

front, rear(back)

배열로 큐 만들기

요소 인큐는 넣기만 하면 되지만

디큐는 요소를 꺼낸 다음 나머지 요소들을 모두 앞으로 이동시켜주어야 함

시간복잡도가 O(n)이므로 느림

링 버퍼로 큐 만들기

배열 요소를 앞으로 옮길 필요가 없음

배열의 맨 끝에서 다시 맨 앞으로 옴

첫 요소와 마지막 요소를 구별하기 위한 프런트와 리어 변수를 설정해주어야 함

#include <iostream>
using namespace std;

class queue {
private:
	int max;
	int num;	//현재 요소 개수
	int front;
	int rear;
	int* que;
public:
	queue(int max) : max(max), num(0), front(0), rear(0) {
		que = new int[max];
	}
	~queue() {
		delete[] que;
		max = num = front = rear = 0;
	}

	int enque(int x) {
		if (num >= max)		//큐가 가득 참
			return -1;
		else {
			num++;
			que[rear++] = x;
			if (rear == max)
				rear = 0;
		}
		return 0;
	}

	int Deque(int* x) {
		if (num <= 0)		//큐가 비었음
			return -1;
		else {
			num--;
			*x = que[front++];
			if (front == max)
				front = 0;
		}
		return 0;
	}

	int peek(int* x) const {		//큐가 비었음
		if (num <= 0)
			return -1;
		*x = que[front];
		return 0;
	}

	void clear() {
		num = front = rear = 0;
	}

	int capacity() const {
		return max;
	}

	int size() const {
		return num;
	}

	bool IsEmpty() const {
		return num <= 0;
	}

	bool IsFull() const {
		return num <= max;
	}

	int search(int x) const {
		int idx;
		for (int i = 0; i < num; i++) {
			if (que[idx = (i + front) % max] == x)
				return idx;
		}
		return -1;
	}
};

(Do it 자료구조와 함께 배우는 알고리즘 입문 책을 참고해 작성함)

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

[자료구조] 3. 연결리스트  (0) 2023.02.14
[자료구조] 1. 배열(Array)  (0) 2023.01.14

댓글