Biên tập: thienthanit@yahoo.com Nguồn: Neverlan87 Stack là gì nhỉ? À ừm, theo nghĩa tiếng Anh nó có nghĩa là “đống”, hi,dịch vậy thì hơi ngố bạn nhỉ? Thật ra, bạn có thể hiểu stack như là 1 cái thùng đựng sách. Bạn bỏ từ từ sách vào, có phải sách nào bạn bỏ vào cuối cùng cũng nằm ở trên đầu thùng không? Có nghĩa là đưa vào sau nhưng lấy ra trước (LIFO – Last In First Out). Giả sử bạn đã được học qua về stack khi còn mài đũng quần để học cấu trúc dữ liệu cách đây mấy năm, từ hồi còn “write on C”. Chắc hẳn trước khi sử dụng, bạn phải tạo ra cho mình một cấu trúc dữ liệu để mô tả stack trong lập trình. Nhưng nay, với C#, bạn sẽ không phải mò mẫm từng quyển sách cấu trúc dữ liệu để ôn lại cách cài đặt stack khi bỗng dưng quên mất, mà công việc lúc này của bạn lúc này chỉ đơn giản là…lấy mà xài thông qua class Stack nằm trong namespace System.Collections Sau đây là các thuộc tính và phương thức thông dụng của class Stack: Code: PUBLIC PROPERTIES – CÔNG DỤNG Count : trả về số phần tử hiện được lưu trữ trên Stack IsSyncronized: trả về một trị bool cho biết liệu xem việc truy xuất Stack có đồng bộ hay không? SyncRoot: trả về một đối tượng có thể được dùng đồng bộ hóa việc truy xuất stack PUBLIC METHODS-CÔNG DỤNG Clear: gỡ bỏ tất cả các phần tử từ stack Clone: tạo một bản sao của stack Contains: xác định xem 1 phần tử có nằm trên stack hay không? CopyTo: sao các phần tử của stack hoặc 1 phần tử của nó lên mảng 1 chiều khởi đi từ một chỉ số chỉ định Peek: trả đối tượng về đầu hàng nối đuôi Stack không gỡ bỏ nó đi Pop: gỡ bỏ và trả về 1 đối tượng về đầu hàng của stack Push: thêm 1 đối tượng vào đầu hàng stack ToArray: copy các phần tử của stack qua một bản dãy mới Để hiểu hơn về stack, chúng ta sẽ rảo qua 2 ví dụ sau: (ứng dụng dạng console) Ví dụ 1 (lấy từ MSDN) Code: using System; using System.Collections; public class SamplesStack { public static void Main() { // tạo một thể hiện của lớp Stack là myStack. Stack myStack = new Stack(); myStack.Push("Hello"); // nhét chữ “Hello” vào stack myStack.Push("World"); // nhét chữ “World” vào stack myStack.Push("!"); „‟ chữ “!” vào stack Biên tập: thienthanit@yahoo.com Nguồn: Neverlan87 // Hiển thị thuộc tính và giá trị của stack Console.WriteLine( "myStack" ); Console.WriteLine( "\tCount: {0}", myStack.Count ); // in ra số phần //tử của stack Console.Write( "\tValues:" ); PrintValues( myStack ); // hàm PrintValues sẽ in ra các giá trị trong stack } public static void PrintValues( IEnumerable myCollection ) //xây dựng //hàm in các giá trị trong stack { foreach ( Object obj in myCollection ) Console.Write( " {0}", obj ); Console.WriteLine(); } } Kết quả sẽ xuất ra màn hình console dòng chữ: myStack Count: 3 Values: ! World Hello Ví dụ 2: Code: using System; using System.Collections; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { public static void InGiaTri(IEnumerable myCollection) { IEnumerator myEnumerator = myCollection.GetEnumerator(); while (myEnumerator.MoveNext()) Console.WriteLine("{0} ", myEnumerator.Current); Console.WriteLine(); } static void Main(string[] args) { Stack myStack = new Stack(); // khởi tạo 1 thể hiện của stack for (int i = 0; i < 8; i++) // đẩy 8 giá trị nguyên vào stack myStack.Push(i * 9); Console.WriteLine("Cac tri trong myStack:\t"); InGiaTri(myStack); //in ra các giá trị trong stack //đẩy 1 phần tử ra khỏi stack Console.WriteLine("\nDa day ra\t{0}", myStack.Pop()); //cho hiển thị nội dung của myStack sau khi đẩy 1 phần tử Console.WriteLine("Cac gia tri trong myStack:\t"); InGiaTri(myStack); //đẩy tiếp một phần tử nữa ra khỏi stack Console.WriteLine("\nDa day ra\t{0}", myStack.Pop()); Biên tập: thienthanit@yahoo.com Nguồn: Neverlan87 //cho hiển thị nội dung của myStack sau khi đẩy 1 phần tử Console.WriteLine("Cac gia tri trong myStack:\t"); InGiaTri(myStack); //cho mình xem phần tử đầu tiên, lưu ý là mình không muốn đẩy nó khỏi stack Console.WriteLine("Peek:\t{0}", myStack.Peek()); //cho hiển thị nội dung của myStack sau khi xem phần tử Console.WriteLine("Cac gia tri trong myStack:\t"); InGiaTri(myStack); //khai báo 1 mảng chứa 12 phần tử Array myArray = Array.CreateInstance(typeof(int), 12); //gán giá trị cho mảng for (int i = 0; i < myArray.Length; i++) myArray.SetValue(100 * i, i); //cho tui xem các giá trị trong mảng Console.WriteLine("Mang cua toi:"); InGiaTri(myArray); //chép nội dung của myStack lên myArray //đi từ chỉ số 6 myStack.CopyTo(myArray, 6); //cho tui xem giá trị của mảng lúc này Console.WriteLine("Mang sau khi duoc sao chep tu stack:"); InGiaTri(myArray); Console.ReadLine(); } } } . SamplesStack { public static void Main() { // tạo một thể hiện của lớp Stack là myStack. Stack myStack = new Stack( ); myStack.Push("Hello"); // nhét chữ “Hello” vào stack. Pop: gỡ bỏ và trả về 1 đối tượng về đầu hàng của stack Push: thêm 1 đối tượng vào đầu hàng stack ToArray: copy các phần tử của stack qua một bản dãy mới Để hiểu hơn về stack, chúng ta sẽ. void Main(string[] args) { Stack myStack = new Stack( ); // khởi tạo 1 thể hiện của stack for (int i = 0; i < 8; i++) // đẩy 8 giá trị nguyên vào stack myStack.Push(i * 9); Console.WriteLine("Cac