feat: 3408_design_task_manager
This commit is contained in:
parent
fd70e0907c
commit
efb0b723b1
7
3408_design_task_manager/Cargo.lock
generated
Normal file
7
3408_design_task_manager/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "design_task_manager"
|
||||
version = "0.1.0"
|
6
3408_design_task_manager/Cargo.toml
Normal file
6
3408_design_task_manager/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "design_task_manager"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
78
3408_design_task_manager/src/lib.rs
Normal file
78
3408_design_task_manager/src/lib.rs
Normal file
@ -0,0 +1,78 @@
|
||||
use std::collections::{BinaryHeap, HashMap};
|
||||
|
||||
#[derive(Clone, PartialEq, Eq)]
|
||||
pub struct Task {
|
||||
pub uid: i32,
|
||||
pub pid: i32,
|
||||
pub priority: i32,
|
||||
}
|
||||
|
||||
impl Ord for Task {
|
||||
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||
self.priority
|
||||
.cmp(&other.priority)
|
||||
.then(self.pid.cmp(&other.pid))
|
||||
.then(self.uid.cmp(&other.uid))
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd for Task {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
pub struct TaskManager {
|
||||
tasks: HashMap<i32, Task>,
|
||||
max_heap: BinaryHeap<Task>,
|
||||
}
|
||||
|
||||
impl TaskManager {
|
||||
pub fn new(tasks_vec: Vec<Vec<i32>>) -> Self {
|
||||
let tasks_iter = tasks_vec.iter().map(|t| Task {
|
||||
uid: t[0],
|
||||
pid: t[1],
|
||||
priority: t[2],
|
||||
});
|
||||
|
||||
Self {
|
||||
tasks: HashMap::from_iter(tasks_iter.clone().map(|t| (t.pid, t))),
|
||||
max_heap: BinaryHeap::from_iter(tasks_iter),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add(&mut self, uid: i32, pid: i32, priority: i32) {
|
||||
let task = Task { uid, pid, priority };
|
||||
self.tasks.insert(pid, task.clone());
|
||||
self.max_heap.push(task);
|
||||
}
|
||||
|
||||
pub fn edit(&mut self, pid: i32, new_priority: i32) {
|
||||
let task = self.tasks.get_mut(&pid).unwrap();
|
||||
task.priority = new_priority;
|
||||
self.max_heap.push(task.clone());
|
||||
}
|
||||
|
||||
pub fn rmv(&mut self, pid: i32) {
|
||||
self.tasks.remove(&pid);
|
||||
}
|
||||
|
||||
pub fn exec_top(&mut self) -> i32 {
|
||||
let mut result_task: Option<Task> = None;
|
||||
|
||||
while let Some(top_task) = self.max_heap.peek() {
|
||||
if let Some(task) = self.tasks.get(&top_task.pid)
|
||||
&& task == top_task
|
||||
{
|
||||
result_task = Some(task.clone());
|
||||
self.tasks.remove(&top_task.pid);
|
||||
self.max_heap.pop();
|
||||
break;
|
||||
} else {
|
||||
self.max_heap.pop();
|
||||
}
|
||||
}
|
||||
|
||||
result_task.map_or(-1, |t| t.uid)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user