In C, queues are elements that we can easily handle with pointers. In Rust, we have VecDeque included in the standard library, which allows us to manage queues of elements in a simple and easy way. Here's an example:
cargo add k_board
use k_board::{Keyboard, Keys};
use std::collections::VecDeque;
fn main() {
let mut queue: VecDeque<i32> = VecDeque::new();
loop {
let mut option = menu(0);
for key in Keyboard::new() {
match key {
Keys::Up => option = menu(0), // add to queue
Keys::Down => option = menu(1), // clear queue
Keys::Enter => break,
_ => {}
}
}
match option {
0 => add_to_queue(&mut queue),
1 => clear_queue(&mut queue),
_ => {}
}
}
}
fn menu(operation: u8) -> u8 {
std::process::Command::new("clear").status().unwrap();
let mut op: Vec<char> = vec!['*', ' '];
if operation == 1 {
op[0] = ' ';
op[1] = '*';
}
println!(
"{} Add a number to the queue\n{} Free all queue memory",
op[0], op[1]
);
operation
}
fn add_to_queue(queue: &mut VecDeque<i32>) {
queue.push_back(get_number());
println!("Elements in the queue: {:?}", queue);
look_output();
}
fn get_number() -> i32 {
println!("Enter a number to the queue");
let mut input: String = String::new();
std::io::stdin().read_line(&mut input).expect("Error");
let number: i32 = match input.trim().parse() {
Ok(number) => number,
Err(_) => get_number(),
};
number
}
fn clear_queue(queue: &mut VecDeque<i32>) {
queue.clear();
println!("Queue after clear: {:?}", queue);
look_output();
}
fn look_output() {
let mut look_output: String = String::new();
std::io::stdin().read_line(&mut look_output).expect("Error");
}
Top comments (0)