dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
use std::mem::swap;

pub struct Deque<T> {
    st_l: Vec<T>,
    st_r: Vec<T>,
}

impl<T> Deque<T> {
    pub fn new() -> Self {
        Self { st_l: vec![], st_r: vec![] }
    }

    pub fn size(&self) -> usize {
        self.st_l.len() + self.st_r.len()
    }

    fn swap_lr(&mut self) {
        swap(&mut self.st_l, &mut self.st_r);
    }

    pub fn push_right(
        &mut self,
        x: T,
    ) {
        self.st_r.push(x);
    }

    pub fn push_left(
        &mut self,
        x: T,
    ) {
        self.st_l.push(x);
    }

    pub fn pop_right(&mut self) -> Option<T> {
        if !self.st_r.is_empty() {
            return self.st_r.pop();
        }

        while self.st_l.len() > self.st_r.len() + 1 {
            self.st_r.push(self.st_l.pop().unwrap());
        }

        self.st_l.reverse();

        self.st_r.reverse();

        self.swap_lr();

        self.st_r.pop()
    }

    pub fn pop_left(&mut self) -> Option<T> {
        self.swap_lr();

        let v = self.pop_right();

        self.swap_lr();

        v
    }
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test() {
        let mut que = Deque::new();

        que.push_left(0);

        que.push_left(1);

        que.push_left(2);

        que.push_left(3);

        assert_eq!(que.pop_right(), Some(0));

        assert_eq!(que.pop_left(), Some(3));

        que.push_right(4);

        assert_eq!(que.pop_left(), Some(2));

        assert_eq!(que.pop_left(), Some(1));

        assert_eq!(que.pop_left(), Some(4));
    }
}