iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
Software Development

Easy to learn Algorithm系列 第 17

「Day17」陣列實作堆疊

  • 分享至 

  • xImage
  •  

前面有介紹過陣列的概念,這邊來做個實作的範例。

陣列實作堆疊

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

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

佇列在電腦例:計算機模擬、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);
    }
}

目前應該不會太難吧🦔🦔!!

要是哪裡理解上還是邏輯上有錯請各位大大指正,感謝 🧙🧙🧙。


上一篇
「Day16」單向鏈結串列
下一篇
「Day18」河內塔
系列文
Easy to learn Algorithm30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言