Đi trên mặt nước và phát triển phần mềm từ một đặc điểm kỹ thuật sẽ dễ dàng nếu cả hai được đóng băng. Elbert Hubbard
STDIO Stack – Ngăn xếp là cấu trúc dữ liệu quan trọng , là kiến thức không thể thiếu trong khoa học máy tính và được ứng dụng rất nhiều trong lập trình. Nó là kiểu dữ liệu cơ bản để giải những bài toán từ đơn giản đến phức tạp, nhiều bài toán phức tạp đã được đơn giản hóa đi rất nhiều nhờ loại cấu trúc dữ liệu này.
Nội dung bài viết

Giới thiệu

Stack – Ngăn xếp là cấu trúc dữ liệu quan trọng , là kiến thức không thể thiếu trong khoa học máy tính và được ứng dụng rất nhiều trong lập trình. Nó là kiểu dữ liệu cơ bản để giải những bài toán từ đơn giản đến phức tạp, nhiều bài toán phức tạp đã được đơn giản hóa đi rất nhiều nhờ loại cấu trúc dữ liệu này.

Tiền đề bài viết

Sau một thời gian tìm hiểu và ứng dụng Stack, tôi đã có được một số kinh nghiệm và muốn chia sẻ những kiến thức của bản thân.

Đối tượng hướng đến

Vì trong bài này tôi xây dựng Stack bằng Linked List - các bạn có thể tham khảo thêm vấn đề nàycủa tác giả Hòa Đinh - do đó bài viết này hướng đến những bạn có kiến thức về con trỏ và Linked List (danh sách liên kết).
Toàn bộ những ví dụ trong bài này tôi sử dụng ngôn ngữ C++Visual Studio Utimate 2013 trên Windows 8.1.

Stack là gì?

Stack là một kiểu cấu trúc dữ liệu và cơ chế của nó là LIFO (Last In First Out) nghĩa là vào sau ra trước. Ta có thể hình dung Stack như một chồng đĩa ,ta chỉ có thể lấy chiếc đĩa ra hoặc thêm một chiếc đĩa khác vào trên đỉnh của nó và chiêc đĩa nằm trên đỉnh đó được gọi là Top.

ss_1

Các phương thức của Stack

Cài đặt cấu trúc stack

Trong bài này tôi sử dụng struct để tạo cấu trúc stack.

struct Number
{
	int number;
	Number *pNextNum;
};
Number *top;

Trên đây tôi tạo một struct tên là Number, trong struct này gồm có một field kiểu int để lưu trữ giá trị của một phần tử và con trỏ kiểu Number để trỏ tới phần tử kế tiếp trên nó trong stack. Con trỏ top kiểu Number dùng để trỏ tới phần tử trên cùng của stack.

isEmpty()

Phương thức isEmpty này giúp kiểm tra stack có rỗng hay không, nếu rỗng sẽ trả về true nếu không rỗng sẽ trả về false.

int isEmpty()
{
    if (top == NULL)
        return true;
    return false;
}

Push()

Phương thức Push là thêm một phần tử vào trên cùng của stack.

void pushNum(int value)
{
    Number *ptr = new Number;//tạo mới một phần tử
    ptr->number = value;     //gán giá trị cho phần tử
    ptr->pNextNum = top; //phần tử này trỏ tới phần tử dưới nó trong stack
    top = ptr;    //đánh dấu phần tử này hiện đang nằm trên đỉnh của stack
}

Trước tiên ta tạo ra một con trỏ mới kiểu Number và gán giá trị cho phần tử này. Cho phần tử này liên kết đến phần tử nằm ngay dưới nó bằng cách sử dụng field pNextNum trỏ tới phần tử đó. Cuối cùng ta dùng con trỏ top trỏ tới phần tử vừa được thêm vào stack để có thể lấy phần tử đó ra.

Pop()

Phương thức Pop là lấy một phần tử nằm trên đỉnh của stack.

int popNumber()
{
	int result = 0;
	if (isEmpty())
	{
		return NULL; //nếu stack rỗng thì return về NULL
	}
	else
	{
		Number *ptr = top; //dùng một con trỏ trỏ tới phần tử đầu tiên của stack
		result = top->number; //lấy giá trị 
		top = top->pNextNum; //gán con trỏ top cho phần tử ngay dưới nó
		delete ptr;		//delete phần tử vừa được lấy
		return result;	// trả kết quả
	}
}

Nhiệm vụ của phương thức này là lấy một phần tử ở trên đỉnh của stack và trả về giá trị của phần tử đó. Ngay sau khi lấy một phần tử ra thì ta phải xóa phần tử đó đi để tránh memory leak.

Chúng ta có thể hình dung stack được xây dựng bằng linked list qua sơ đồ sau:

ss_2

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG