use std::collections::VecDeque;
pub trait Bag<T> {
fn new() -> Self;
fn put(&mut self, t: T);
fn get(&mut self) -> Option<T>;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
}
pub struct StackBag<T>(Vec<T>);
pub struct QueueBag<T>(VecDeque<T>);
impl<T> Bag<T> for StackBag<T> {
fn put(&mut self, t: T) {
self.0.push(t)
}
fn get(&mut self) -> Option<T> {
self.0.pop()
}
fn len(&self) -> usize {
self.0.len()
}
fn new() -> Self {
Self(vec![])
}
}
impl<T> Bag<T> for QueueBag<T> {
fn put(&mut self, t: T) {
self.0.push_back(t)
}
fn get(&mut self) -> Option<T> {
self.0.pop_front()
}
fn len(&self) -> usize {
self.0.len()
}
fn new() -> Self {
Self(VecDeque::new())
}
}
pub fn triangle_numbers(n: i32) -> i32 {
if n & 0b1 > 0 {
n * ((n + 1) / 2)
} else {
(n / 2) * (n + 1)
}
}