package main
import (
"bufio"
"os"
"strconv"
"strings"
)
type Deque struct {
head *DequeNode
tail *DequeNode
size int
}
type DequeNode struct {
data int
next *DequeNode
prev *DequeNode
}
var (
deq *Deque = new(Deque)
)
// 1: 정수 x를 덱의 앞에
func push_front(x int) {
newNode := new(DequeNode)
newNode.data = x
if deq.size == 0 {
deq.head = newNode
deq.tail = newNode
} else {
newNode.next = deq.head
deq.head.prev = newNode
deq.head = newNode
}
deq.size++
}
// 2: 정수 x를 덱의 뒤에
func push_back(x int) {
newNode := new(DequeNode)
newNode.data = x
if deq.size == 0 {
deq.head = newNode
deq.tail = newNode
} else {
newNode.prev = deq.tail
deq.tail.next = newNode
deq.tail = newNode
}
deq.size++
}
// 3: 덱에 정수가 있다면 맨 앞의 정수 빼고 출력, 없다면 -1 출력
func pop_front() int {
if deq.size == 0 {
return -1
}
ret := deq.head.data
deq.head = deq.head.next
deq.size--
return ret
}
// 4: 덱의 정수가 있다면 맨 뒤의 정수를 빼고 출력, 없다면 -1 출력
func pop_back() int {
if deq.size == 0 {
return -1
}
ret := deq.tail.data
deq.tail = deq.tail.prev
deq.size--
return ret
}
// 5: 덱에 들어있는 정수 개수 출력
func size() int {
return deq.size
}
// 6: 덱이 비어있으면 1, 아니면 0 출력
func empty() int {
if deq.size == 0 {
return 1
}
return 0
}
// 7: 덱의 가장 앞에 있는 정수 출력, 없다면 -1 출력
func front() int {
if deq.size == 0 {
return -1
}
return deq.head.data
}
// 8: 덱의 가장 뒤에 있는 정수 출력, 없다면 -1 출력
func back() int {
if deq.size == 0 {
return -1
}
return deq.tail.data
}
func main() {
sc := bufio.NewScanner(os.Stdin)
wr := bufio.NewWriter(os.Stdout)
defer wr.Flush()
var N int
if sc.Scan() {
N, _ = strconv.Atoi(sc.Text())
}
for ; N != 0; N-- {
sc.Scan()
tmp := strings.Fields(sc.Text())
switch tmp[0] {
case "1":
temp_int, _ := strconv.Atoi(tmp[1])
push_front(temp_int)
case "2":
temp_int, _ := strconv.Atoi(tmp[1])
push_back(temp_int)
case "3":
wr.WriteString(strconv.Itoa(pop_front()))
wr.WriteByte('\n')
case "4":
wr.WriteString(strconv.Itoa(pop_back()))
wr.WriteByte('\n')
case "5":
wr.WriteString(strconv.Itoa(size()))
wr.WriteByte('\n')
case "6":
wr.WriteString(strconv.Itoa(empty()))
wr.WriteByte('\n')
case "7":
wr.WriteString(strconv.Itoa(front()))
wr.WriteByte('\n')
case "8":
wr.WriteString(strconv.Itoa(back()))
wr.WriteByte('\n')
}
}
return
}
/*
# 문자열 공백 포함 입력 받기
if sc.Scan() {
tmp := sc.Text()
wr.WriteString(tmp)
}
*/