블로그 이미지
황상두

카테고리

기타 (101)
알고리즘(백준) (3)
임베디드 보안 (7)
windows internal (22)
공부 (16)
전공 스터디 (27)
과제 (8)
영어 (6)
기록물 (6)
Total
Today
Yesterday

달력

« » 2024.11
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

공지사항

태그목록

최근에 올라온 글

Deque 구현

알고리즘(백준) / 2017. 12. 17. 16:11

백준 알고리즘 문제를 풀어보는 중이다.

덱의 경우 스택과 큐 2개의 기능을 다 할 수 있다.
앞 뒤로 넣었다 뺐다 가능하다.
LIFO와 FIFO 둘 다 가능한 형태이다.

배열로 구현중인데 배열보다는 연결리스트로 구현하는 것이 쉽다.
요소가 1개일 때와 0개일 때 구별하는데 있어서 연결리스트가 훨씬 용이하다.

* 배열로 구현

///* 배열로 deque구현
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
#define MAX 10000
template <class T>
class Deque
{
private:
    T element[MAX];
    int size;
    int head;
    int tail;
public:
    Deque()
        : size(0), head(0), tail(0)
    {}
    void push_front(T _element)
    {
        if (getSize() == MAX - 1){
            //cout << "size error" << endl;
            return;
        }
        if (size++ > 0){
            head = (head - 1 + MAX) % MAX;
        }
        element[head] = _element;
    }
    void push_back(T _element)
    {
        if (getSize() == MAX - 1){
            //cout << "size error" << endl;
            return;
        }
        if (size++ > 0)
            tail = (tail + 1) % MAX;
        element[tail] = _element;
    }
    T front()
    {
        //cout << element[head] << endl;
        return isEmpty() ? -1 : element[head];
    }
    T back()
    {
        //cout << element[tail] << endl;
        return isEmpty() ? -1 : element[tail];
    }
    T pop_front()
    {
        if (isEmpty()){
        //    cout << "size error" << endl;
            return -1;
        }
        size--;
        int temp = head;
        if (size > 0)
            head = (head + 1) % MAX;
        return element[temp];
    }
    T pop_back()
    {
        if (isEmpty()){
            //cout << "size error" << endl;
            return -1;
        }
        size--;
        int temp = tail;
        if (size > 0)
            tail = (MAX + tail - 1) % MAX;
        return element[temp];
    }
    int getSize()
    {
        return size;
    }
    bool isEmpty()
    {
        //return getSize() ? false : true;
        return getSize() ? 0 : 1;
    }
    ~Deque(){}
};

int main()
{
    int testcase;
    cin >> testcase;
    string cmnd;
    Deque<int> deque;
    int element;
    for (int i = 0; i < testcase; i++)
    {
        cin >> cmnd;
        if (!cmnd.compare("push_front")){
            cin >> element;
            deque.push_front(element);
        }
        else if (!cmnd.compare("push_back")){
            cin >> element;
            deque.push_back(element);
        }
        else if (!cmnd.compare("pop_front"))
            cout << deque.pop_front() << endl;
        else if (!cmnd.compare("pop_back"))
            cout << deque.pop_back() << endl;
        else if (!cmnd.compare("size"))
            cout << deque.getSize() << endl;
        else if (!cmnd.compare("empty"))
            cout << deque.isEmpty() << endl;
        else if(!cmnd.compare("front"))
            cout << deque.front() << endl;
        else if(!cmnd.compare("back"))
            cout << deque.back() << endl;
    }
    return 0;
}

* 이중 연결리스트

///*이중 연결리스트로 deck구현하기!
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class DequeNode
{
private:
public:
	int data;
	DequeNode* rLink;
	DequeNode* lLink;
	DequeNode(int _data = 0)
		: data(_data), rLink(NULL), lLink(NULL)
	{}
	~DequeNode()
	{}
};


class Deque
{
private:
	DequeNode* head;
	DequeNode* tail;
public:
	Deque()
		: head(NULL), tail(NULL)
	{}
	~Deque()
	{}
	void push_front(int _element)
	{
		DequeNode* newNode = new DequeNode(_element);
		//if (head)//head != NULL
		if (isEmpty())
			head = tail = newNode;
		else
		{
			head->lLink = newNode;
			newNode->rLink = head;
			head = newNode;
		}
	}
	void push_back(int _element)
	{
		DequeNode* newNode = new DequeNode(_element);
		if (isEmpty())
			tail = head = newNode;
		else
		{
			tail->rLink = newNode;
			newNode->lLink = tail;
			tail = newNode;
		}
	}
	int pop_front()
	{
		if (isEmpty())
			return -1;
		int data = head->data;
		//요소가 2개 이상이면
		if (head != tail)
		{
			head = head->rLink;
			head->lLink = NULL;
			delete head->lLink;
		}
		//요소가 1개라면
		else{
			delete head;
			tail = head = NULL;
		}
		return data;
	}
	int pop_back()
	{
		if (isEmpty())
			return -1;
		int data = tail->data;
		
		//요소가 2개 이상이면
		if (head != tail){
			tail = tail->lLink;
			tail->rLink = NULL;
			delete tail->rLink;
		}
		//요소가 1개이면
		else
		{
			delete head;
			head = tail = NULL;
		}
		return data;
	}
	bool isEmpty()
	{
		//return (head == NULL) ? true : false;
		return (head == NULL) ? 1 : 0;
	}
	int front()
	{
		if (isEmpty())
			return -1;
		return head->data;
	}
	int back()
	{
		if (isEmpty())
			return -1;
		return tail->data;
	}
	int getSize()
	{
		if (isEmpty())
			return 0;
		int cnt = 1;
		DequeNode* node = head;
		while (node = node->rLink)
			cnt++; 
		return cnt;
	}
};
int main()
{
	int testcase;
	cin >> testcase;
	string cmnd;
	Deque deque;
	int element;
	for (int i = 0; i < testcase; i++)
	{
		cin >> cmnd;
		if (!cmnd.compare("push_front")){
			cin >> element;
			deque.push_front(element);
		}
		else if (!cmnd.compare("push_back")){
			cin >> element;
			deque.push_back(element);
		}
		else if (!cmnd.compare("pop_front"))
			cout << deque.pop_front() << endl;
		else if (!cmnd.compare("pop_back"))
			cout << deque.pop_back() << endl;
		else if (!cmnd.compare("size"))
			cout << deque.getSize() << endl;
		else if (!cmnd.compare("empty"))
			cout << deque.isEmpty() << endl;
		else if (!cmnd.compare("front"))
			cout << deque.front() << endl;
		else if (!cmnd.compare("back"))
			cout << deque.back() << endl;
	}
	return 0;
}
//*/
Posted by 황상두
, |

최근에 달린 댓글

글 보관함