입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
#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();
}
연결리스트를 구현하여도 시간이 얼마 안걸린다.