백준10866(덱)

jh Seo·2022년 11월 7일
0

백준

목록 보기
70/180

개요

백준 10866번: 덱

  • 입력
    첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

  • 출력
    출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

접근 방식

  1. 이중연결리스트를 구현하여 큐를 구현하였다.

코드

#include<iostream>

using namespace std;

struct Node {
	int data;
	Node* prev;
	Node* next;
};

class deque {
private:
	int size;
	Node* head;
	Node* tail;

public:
	//생성자
	deque() {
		size = 0;
		head = new Node;
		tail = new Node;
		head->data = -1;
		tail->data = -1;
		head->prev = head;
		head->next = tail;
		tail->prev = head;
		tail->next = tail;
	}
	//소멸자
	~deque() {
		Node* tmp = head;
		Node* delNode = new Node;
		while (tmp != tail) {
			delNode = tmp;
			tmp = tmp->next;
			delete delNode;
		}
		delete tmp;
	}

	void push_front(int X) {
		Node* newNode = new Node;
		newNode->data = X;
		head->next->prev = newNode;
		newNode->next = head->next;
		newNode->prev = head;
		head->next = newNode;
		size++;
	}
	void push_back(int X) {
		Node* newNode = new Node;
		newNode->data = X;
		tail->prev->next = newNode;
		newNode->prev = tail->prev;
		newNode->next = tail;
		tail->prev = newNode;
		size++;
	}
	void pop_front() {
		if (empty()) {
			cout << -1<<'\n';
			return;
		}
		
		Node* delNode = head->next;
		cout << delNode->data << '\n';
		delNode->next->prev = head;
		head->next = delNode->next;
		delete delNode;
		size--;
	}
	void pop_back() {
		if (empty()) {
			cout << -1<<'\n';
			return;
		}
		Node* delNode = tail->prev;
		cout << delNode->data << '\n';
		delNode->prev->next = tail;
		tail->prev= delNode->prev;
		delete delNode;
		size--;
	}
	int Size() {
		return size;
	}
	bool empty() {
		if (Size()) return 0;
		else return 1;
	}
	int front() {
		if (empty()) {
			
			return -1;
		}
		return head->next->data;
	}
	int back() {
		if (empty()) {
			return -1;
		}
		return tail->prev->data;
	}


};

void input() {
	int N = 0;
	string cmd="";
	deque dq;

	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> cmd;
		if (cmd == "push_front") {
			int tmp=0;
			cin >> tmp;
			dq.push_front(tmp);
		}
		else if (cmd == "push_back") {
			int tmp=0;
			cin >> tmp;
			dq.push_back(tmp);
		}
		else if (cmd == "pop_back") {
			dq.pop_back();
		}
		else if (cmd == "pop_front") {
			dq.pop_front();
		}
		else if (cmd == "front") {
			cout<<dq.front()<<'\n';
		}
		else if (cmd == "back") {
			cout<<dq.back()<<'\n';

		}
		else if (cmd == "empty") {
			cout << dq.empty()<<'\n';
		}
		else if (cmd == "size") {
			cout << dq.Size()<<'\n';

		}

	}
}

int main() {
	input();
}

문풀후생

연결리스트를 구현하여도 시간이 얼마 안걸린다.

profile
코딩 창고!

0개의 댓글