Easyfun Easy fun Easy to play

Stack&Queue

陣列實作堆疊

堆疊和佇列都是屬於抽象資料型態

堆疊結構時常被用來解決問題,例:遞迴呼叫、副程式的呼叫。

佇列在電腦例:計算機模擬、CPU的工作排程。

陣列堆疊

以陣列結構來做堆疊的好處是製作與設計的演算法都很簡單,但因堆疊本身是變動的,則陣列大小並無法事先規劃宣告,太大浪費空間,太小則不夠用。

fn main() {
    let mut stack: Vec<i32> = Vec::new();
    if stack .isempty() {
        println!("堆疊為空");
    } else {
        println!("堆疊不為空");
    }
    
    println!("{}", sum);
}

範例: 用陣列結構來push或pop元素,最後輸出所有元素:

fn main() {

    const MAX_CAPACITY: usize = 100; 
    let mut stack: [i32; MAX_CAPACITY] = [0; MAX_CAPACITY]; 
    let mut top: usize = 0; 

    // 向堆栈中插入元素
    for i in 1..=10 {
        if top < MAX_CAPACITY {
            stack[top] = i;
            top += 1;o
            println!("成功插入元素 {} 到堆疊。", i);
        } else {
            println!("堆疊已满,無法插入元素 {}。", i);
        }
    }

    println!("從堆疊中彈出元素:");
    while top > 0 {
        top -= 1;
        let element = stack[top];
        println!("{}", element);
    }
}

鏈結串列實作堆疊

使用鏈結串列來做堆疊的優點是隨時可以動態改變串列長度,能有效利用記憶體資源,缺點是設計時演算法較為複雜。

// 定義一個鏈結節點
struct Node<T> {
    data: T,
    next: Option<Box<Node<T>>>,
}

impl<T> Node<T> {
    fn new(data: T) -> Self {
        Node { data, next: None }
    }
}

—`

// 定義堆疊結構Stack
pub fn new() -> Self {
    Stack { top: None }
}

範例: 用鏈結串列來push或pop元素,最後輸出所有元素:

// 定義堆疊结構
pub struct Stack<T> {
    top: Option<Box<Node<T>>>,
    size: usize,
}

impl<T> Stack<T> {
    pub fn new() -> Self {
        Stack { top: None, size: 0 }
    }

    pub fn push(&mut self, data: T) {
        if self.size < 100 {
            let mut new_node = Box::new(Node::new(data));
            new_node.next = self.top.take();
            self.top = Some(new_node);
            self.size += 1;
        } else {
            println!("堆疊已满,無法插入元素。");
        }
    }

    pub fn pop(&mut self) -> Option<T> {
        if let Some(mut node) = self.top.take() {
            self.top = node.next.take();
            self.size -= 1;
            Some(node.data)
        } else {
            None
        }
    }

    pub fn is_empty(&self) -> bool {
        self.size == 0
    }
}

fn main() {
    let mut stack = Stack::new();

    // 在堆疊中插入元素
    for i in 1..=10 {
        stack.push(i);
    }

    // 彈出堆疊中的元素
    while let Some(element) = stack.pop() {
        println!("彈出元素: {}", element);
    }
}