mirror of https://github.com/01-edu/public.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.8 KiB
89 lines
2.8 KiB
4 years ago
|
## lunch_queue
|
||
|
|
||
|
### Instructions
|
||
|
|
||
|
You will have to create an API to organize a queue of people.
|
||
|
|
||
|
Using the given code create the following functions:
|
||
|
|
||
|
- `new` that will initialize the `Queue`.
|
||
|
- `add` that receives the person's information, so it can be added to the `Queue`
|
||
|
- `invert_queue` that invert the queue of persons
|
||
|
- `rm`, that will remove the person that finished ordering their food.
|
||
|
The method for organizing the manipulation of a data structure should be a
|
||
|
FIFO (first in first out) process. This function should return a tuple wrapped in an `Option`
|
||
|
with the information of that person
|
||
|
- `search`, that return a tuple with the information of a given person `id`.
|
||
|
|
||
|
You must also create a type called `Link` this will be the connection of the structures `Queue` and `Person`.
|
||
|
Do not forget that this will be a recursion type and it must point to `None` if there is no persons.
|
||
|
|
||
|
### Expected Function
|
||
|
|
||
|
```rust
|
||
|
pub struct Queue {
|
||
|
pub node: Link,
|
||
|
}
|
||
|
|
||
|
pub type Link =
|
||
|
|
||
|
pub struct Person {
|
||
|
pub id: i32,
|
||
|
pub name: String,
|
||
|
}
|
||
|
|
||
|
impl Queue {
|
||
|
pub fn new() -> Queue {}
|
||
|
pub fn add(&mut self, t: String, name: String) {}
|
||
|
pub fn invert_queue(&mut self) {}
|
||
|
pub fn rm(&mut self) -> Option<String> {}
|
||
|
pub fn search(&self) -> Option<(String, String)> {}
|
||
|
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Usage
|
||
|
|
||
|
Here is a program to test your function
|
||
|
|
||
|
```rust
|
||
|
fn main() {
|
||
|
let mut list = Queue::new();
|
||
|
list.add(String::from("Marie"), 20);
|
||
|
list.add(String::from("Monica"), 15);
|
||
|
list.add(String::from("Ana"), 5);
|
||
|
list.add(String::from("Alice"), 35);
|
||
|
println!("{:?}", list);
|
||
|
|
||
|
println!("{:?}", list.search("Marie"));
|
||
|
println!("{:?}", list.search("Alice"));
|
||
|
println!("{:?}", list.search("someone"));
|
||
|
|
||
|
println!("removed {:?}", list.rm());
|
||
|
println!("list {:?}", list);
|
||
|
println!("invert {:?}", list.invert_queue());
|
||
|
}
|
||
|
```
|
||
|
|
||
|
And its output:
|
||
|
|
||
|
```console
|
||
|
student@ubuntu:~/[[ROOT]]/test$ cargo run
|
||
|
Queue { node: Some(Person { name: "Alice", discount: 35, next_person: Some(Person { name: "Ana", discount: 5, next_person: Some(Person { name: "Monica", discount: 15, next_person: Some(Person { name: "Marie", discount: 20, next_person: None }) }) }) }) }
|
||
|
Some(("Marie", 20))
|
||
|
Some(("Alice", 35))
|
||
|
None
|
||
|
removed Some(("Marie", 20))
|
||
|
removed Some(("Monica", 15))
|
||
|
list Queue { node: Some(Person { name: "Alice", discount: 35, next_person: Some(Person { name: "Ana", discount: 5, next_person: None }) }) }
|
||
|
inverted list Queue { node: Some(Person { name: "Ana", discount: 5, next_person: Some(Person { name: "Alice", discount: 35, next_person: None }) }) }
|
||
|
student@ubuntu:~/[[ROOT]]/test$
|
||
|
```
|
||
|
|
||
|
### Notions
|
||
|
|
||
|
- https://doc.rust-lang.org/rust-by-example/custom_types/enum.html
|
||
|
- https://doc.rust-lang.org/book/ch15-01-box.html
|
||
|
- https://doc.rust-lang.org/std/option/
|
||
|
- https://doc.rust-lang.org/book/ch15-01-box.html
|