Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Bàn về Queue trong lập trình C#

  1. #1
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Smile Bàn về Queue trong lập trình C#

    BÀN VỀ QUEUE TRONG C#
    Queue là gì nhỉ? Tra trong từ điển, bạn sẽ thấy nó có nghĩa là “xếp hàng”. A, mình biết rồi, có phải chúng mình học nó để tạo ra 1 hàng đợi không nhỉ? Chính xác là thế rồi, nhớ hồi học cấp 1, mỗi khi vào lớp, cô giáo thường cho tụi mình xếp hàng vào lớp, bạn nào đứng đầu hàng thì chắc chắn vào lớp trước rồi. Nhưng đó là ở ngoài đời, trong C# nó ra sao nhỉ? Mình giả sử là các bạn đã được học qua về Queue trong môn cấu trúc dữ liệu, và bài tutorial này được viết ra để các bạn đã, đang và sẽ học C# tham khảo về Queue.
    Trong C#, chúng ta sử dụng lớp Queue để tạo ra những đối tượng hàng đợi để đáp ứng các yêu cầu của bài toán Sau đây là một số thuộc tính và phương thức thông dụng trong class Queue:
    Code:
    PUBLIC PROPERTIES – CÔNG DỤNG
    Count: trả về số phần tử hiện được lưu trữ trong hàng đợi
    IsSynchronized: trả về một trị bool cho biết liệu xem việc truy xuất Queue có đồng bộ hay không?
    SyncRoot: trả về 1 đối tượng có thể được dùng đồng bộ hóa việc truy xuất Queue
    
    PUBLIC METHODS – CÔNG DỤNG
    Clear: xóa sạch hàng đợi
    Clone: tạo ra 1 bản sao cho hàng đợi
    Contains: xác định xem một phần tử có nằm trong hàng đợi hay không
    CopyTo: sao chép 1 hoặc nhiều phần tử của hàng đợi lên mảng 1 chiều hiện hữu khởi đi từ chỉ mục được chỉ định
    Enqueue: thêm một phần tử vào cuối hàng đợi
    Dequeue: lấy ra và trả về phần tử đầu hàng đợi
    GetEnumerator: trả về 1 enumerator cho phép rảo qua hàng đợi
    GetHashCode: dùng như là 1 hàm băm (hash function) đối với một kiểu dữ liệu đặc biệt, thích ứng cho việc sử dụng trong các giải thuật băm và các cấu trúc dữ liệu giống như 1 bảng băm
    GetType:trả về 1 kiểu dữ liệu Type của thể hiện hiện hành
    Peek: trả về đối tượng nằm ở đầu hàng đợi, nhưng không gỡ bỏ nó khỏi hàng đợi
    ToArray: sao chép các phần tử của hàng đợi qua 1 mảng 1 chiều
    Để hiểu hơn về Queue, mình lấy 2 ví dụ minh họa:

    Ví dụ 1 (lấy từ MSDN)
    Visual C# Code:
    1. using System;
    2. using System.Collections;
    3. public class SamplesQueue
    4. {
    5.  
    6.     public static void Main()
    7.     {
    8.  
    9.         // tạo 1 thể hiện của lớp Queue
    10.         Queue myQ = new Queue();
    11.         myQ.Enqueue("Hello"); // đưa "Hello" vào cuối hàng đợi
    12.         myQ.Enqueue("World"); // đưa "Word" vào cuối hàng đợi
    13.         myQ.Enqueue("!"); // đưa "!" vào cuối hàng đợi
    14.  
    15.         // Hiển thị thuộc tính và giá trị của hàng đợi
    16.         Console.WriteLine("myQ");
    17.         Console.WriteLine("\tCount:    {0}", myQ.Count); //dùng để xem số lượng phần tử trong Queue
    18.         Console.Write("\tValues:");
    19.         PrintValues(myQ); // hàm này để in các giá trị trong Queue
    20.         Console.ReadLine();
    21.     }
    22.  
    23.  
    24.     public static void PrintValues(IEnumerable myCollection)
    25.     {
    26.         foreach (Object obj in myCollection)
    27.             Console.Write("    {0}", obj);
    28.         Console.WriteLine();
    29.     }
    30. }
    31. /*
    32. Đoạn code trên cho kết quả sau trên màn hình console:
    33.  
    34. myQ
    35.     Count:    3
    36.     Values:    Hello    World    !
    37. */

    Ví dụ 2:
    Visual C# Code:
    1. using System;
    2. using System.Collections;
    3. public class SamplesQueue
    4. {
    5.     public static void InGiaTri(IEnumerable myCollection)
    6.     {
    7.         IEnumerator myEnumerator = myCollection.GetEnumerator();
    8.         Console.Write("Gia tri cua hang doi:\t");
    9.         while (myEnumerator.MoveNext())
    10.             Console.Write("{0}  ", myEnumerator.Current);
    11.         Console.WriteLine();
    12.     }
    13.     public static void Main()
    14.     {
    15.         Queue hangdoi = new Queue();
    16.         for (int i = 0; i < 8; i++)
    17.             hangdoi.Enqueue(i * 5);
    18.         //cho hiển thị các giá trị trong hàng đợi
    19.         InGiaTri(hangdoi);
    20.         //cho gỡ bỏ 1 phần tử ra khỏi hàng đợi
    21.         Console.WriteLine("Removed:\t{0}", hangdoi.Dequeue());
    22.         //cho hiển thị các giá trị trong hàng đợi sau khi gỡ bỏ 1 phần tử
    23.         InGiaTri(hangdoi);
    24.         //lại gỡ bỏ thêm 1 phần tử nữa ra khỏi hàng đợi
    25.         Console.WriteLine("Removed:\t{0}", hangdoi.Dequeue());
    26.         //lại hiển thị nữa
    27.         InGiaTri(hangdoi);
    28.         //cho tui xem phần tử đầu hàng đợi nhé, nhưng không được gỡ bỏ đâu đó
    29.         Console.WriteLine("\nPhan tu dau hang doi:\t{0}", hangdoi.Peek());
    30.         //cho hiển thị các phần tử trong hàng đợi
    31.         InGiaTri(hangdoi);
    32.         Console.ReadLine();
    33.     }
    34. }

  2. #2
    Ngày gia nhập
    11 2006
    Bài viết
    2

    Hay quá neverland87, rất có ích, tuy nhiên nếu không biết phần này "Collection" thì lập trình viên cũng có thể tự cài đặt thuật toán nhưng sẽ mất thời gian,queue - mình thường gọi là hàng đợi, bạn có thể viết luôn phần List và Array List được không? Cám ơn
    Đã được chỉnh sửa lần cuối bởi ceater : 13-04-2007 lúc 02:03 PM.

  3. #3
    Ngày gia nhập
    10 2010
    Nơi ở
    HCM
    Bài viết
    171

    Em chào anh neverland87. Đọc các bài viết của anh rất hay và thích thú, em kiếm thông tin mãi về anh mà không được và quyết định gia nhập diễn đàn. Em có một bài cần anh giúp:
    "Write a console application that to add six cities to a Queue list from keyboard (Using Console.ReadLine() ), and to display the items in the Queue."
    Em tạm dịch ra thế này nhé: "viết giao diện chương trình bằng Console để thêm(nhập) tên 6 thành phố từ bàn phím, Dùng cái Queue List và hiển thị chúng."
    Em đang học C# một mình (Ở lớp hoc theo môn MLC: Nghĩa là Chuyển code VB sang C#). Em muốn mình tự học. Em có lên MSDN mà không hiểu lắm.
    Em chỉ mới làm được thế này thôi:
    Visual C# Code:
    1.         public static void Main(string[] args)
    2.         {
    3.             //Declare a String variable with name is myInput
    4.             string myInput;
    5.             Queue myQ = new Queue();
    6.             Console.Write("Please enter cities: "); //Place the user input into the variable myInt with Console.Readline()        
    7.             myInput = Console.ReadLine();
    8.             Console.WriteLine("");//Skip a line for nicer formatting
    9.             //On the next line, display the input.
    10.             //{0} is where the variable value will go.
    11.             //It is followed by a comma and variable name userName
    12.             Console.WriteLine("Cities: {0}!", myInput);
    13.             Console.WriteLine("Press Enter to Exit");
    14.             //The Console.Readline will pause the program until you
    15.             //press [ENTER]. Then it will exit.
    16.             Console.ReadLine();
    17.         }

    Code của em viết hoàn toàn bằng tiếng anh hi Em quen rùi mong anh em chỉ bảo. Em mới vô. Xin mấy anh nhiệt tình giúp.

  4. #4
    Ngày gia nhập
    03 2009
    Bài viết
    32

    Bạn khai mới chỉ nhập vào cái biến thôi chứ đã đưa nó vào queue đâu.
    Bạn sử dụng EnQueue để đưa một phân tử vào cuối hàng đợi.

    Visual C# Code:
    1. myQ.Enqueue(myInput);

    In các phần tử trong hàng đợi :
    Visual C# Code:
    1.             foreach (string city in myQ)
    2.             {
    3.                 Console.WriteLine("Name city : {0}",city);
    4.             }
    Đã được chỉnh sửa lần cuối bởi action : 04-10-2010 lúc 12:46 AM.

  5. #5
    Ngày gia nhập
    03 2009
    Bài viết
    32

    À bạn nào cho mình hỏi 2 cách khai báo sau thì nó khác nhau chổ nào

    Visual C# Code:
    1. //thêm thư viện
    2. using System.Collections;
    3.  
    4. //Khai báo Queue:
    5. Queue myQueue = new Queue();

    và cách khai báo :
    Visual C# Code:
    1. Queue<T> myQueue = new Queue<T>();
    2. //T là kiểu dữ liệu

  6. #6
    Ngày gia nhập
    10 2010
    Nơi ở
    HCM
    Bài viết
    171

    Mặc định Bàn về Queue trong lập trình C#

    Sau 2 ngày post bài @@ sư huynh neverland87 đã mất tích, Mình quyết định tư làm trong 2 hôm, vì mới tự hoc C# hehe trình độ còn gà nên đã giải xong. Mình post code lên ai thực sự hiểu thì thanks cái hen. Có ai có cách khác thì giúp anh em khai thông học vấn.

    Visual C# Code:
    1.         public static void Main(string[] args)
    2.         {
    3.             //Place the user input into the data
    4.             Console.WriteLine("Please enter a city: ");
    5.             //Declare a queue
    6.             string[] Queue = new string[6];
    7.             for (int j = 0; j < Queue.Length; j++)
    8.             {
    9.                 Queue[j] = Console.ReadLine();
    10.             }
    11.             Console.WriteLine("");//Skip a line for nicer formatting
    12.  
    13.             //It is followed by a comma and variable name userName
    14.             Console.WriteLine("6 cities had inputed: ");
    15.             for (int i = 0; i < Queue.Length; i++)
    16.             {
    17.                 Console.WriteLine(Queue[i].ToString());
    18.             }
    19.             Console.WriteLine();
    20.             Console.WriteLine("Press Enter to Exit");
    21.             //The Console.Readline will pause the program until you
    22.             //press [ENTER]. Then it will exit.
    23.             Console.ReadLine();
    24.         }
    Chúc anh em học tập tiến bộ

    Trích dẫn Nguyên bản được gửi bởi action Xem bài viết
    À bạn nào cho mình hỏi 2 cách khai báo sau thì nó khác nhau chổ nào

    Visual C# Code:
    1. //thêm thư viện
    2. using System.Collections;
    3.  
    4. //Khai báo Queue:
    5. Queue myQueue = new Queue();

    và cách khai báo :
    Visual C# Code:
    1. Queue<T> myQueue = new Queue<T>();
    2. //T là kiểu dữ liệu
    Theo mình hiểu khi xài Queue và Stack thì nên add thêm thư viện Collection thay vì mình phải cài đặt như trước ở C++. Giờ đây mình có thể lấy sẵn qua thư viện này. Còn Cách khai 1 là khai báo thể hiện 1 queue thôi, cách khai thứ 2 là ép kiểu dư liệu lên thẳng queue. Kiến thức mình có từ MSDN nên có thể giải thích thế hì

    Trích dẫn Nguyên bản được gửi bởi action Xem bài viết
    Bạn khai mới chỉ nhập vào cái biến thôi chứ đã đưa nó vào queue đâu.
    Bạn sử dụng EnQueue để đưa một phân tử vào cuối hàng đợi.
    Visual C# Code:
    1. myQ.Enqueue(myInput);

    In các phần tử trong hàng đợi :
    Visual C# Code:
    1. foreach (string city in myQ)
    2.             {
    3.                 Console.WriteLine("Name city : {0}",city);
    4.             }
    Cảm ơn bạn đã xem qua, Mình đưa cái đó là code test của mình hihihi ^^ Mình làm ra rùi đó mong bạn và anh em xem qua hen

  7. #7
    Ngày gia nhập
    03 2009
    Bài viết
    32

    Trích dẫn Nguyên bản được gửi bởi hugovsmoon Xem bài viết
    Sau 2 ngày post bài @@ sư huynh neverland87 đã mất tích, Mình quyết định tư làm trong 2 hôm, vì mới tự hoc C# hehe trình độ còn gà nên đã giải xong. Mình post code lên ai thực sự hiểu thì thanks cái hen. Có ai có cách khác thì giúp anh em khai thông học vấn.

    Visual C# Code:
    1.         public static void Main(string[] args)
    2.         {
    3.             //Place the user input into the data
    4.             Console.WriteLine("Please enter a city: ");
    5.             //Declare a queue
    6.             string[] Queue = new string[6];
    7.             for (int j = 0; j < Queue.Length; j++)
    8.             {
    9.                 Queue[j] = Console.ReadLine();
    10.             }
    11.             Console.WriteLine("");//Skip a line for nicer formatting
    12.  
    13.             //It is followed by a comma and variable name userName
    14.             Console.WriteLine("6 cities had inputed: ");
    15.             for (int i = 0; i < Queue.Length; i++)
    16.             {
    17.                 Console.WriteLine(Queue[i].ToString());
    18.             }
    19.             Console.WriteLine();
    20.             Console.WriteLine("Press Enter to Exit");
    21.             //The Console.Readline will pause the program until you
    22.             //press [ENTER]. Then it will exit.
    23.             Console.ReadLine();
    24.         }

    Chúc anh em học tập tiến bộ
    Cái bạn làm ở đây là làm khai báo một mảng với tên là Queue chứ không phải là Queue, Bạn nên đọc kỉ lại bài của neverland87 đi

  8. #8
    Ngày gia nhập
    06 2010
    Nơi ở
    HCM
    Bài viết
    19

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Collections;
    6.  
    7. namespace NhapThanhPho
    8. {
    9.     class Program
    10.     {
    11.         static void Main(string[] args)
    12.         {
    13.             Queue myQ = new Queue();
    14.             Console.Write("Please enter number city: ");
    15.             int n = int.Parse(Console.ReadLine());
    16.             //Place the user input into the data
    17.             Console.WriteLine("Please enter a city: ");
    18.             for (int j = 0; j < n; j++)
    19.             {
    20.                 string k = Console.ReadLine();
    21.                 myQ.Enqueue(k);
    22.             }
    23.             Console.WriteLine("");//Skip a line for nicer formatting
    24.  
    25.             //It is followed by a comma and variable name userName
    26.             Console.WriteLine("{0} cities had inputed: ", n);
    27.             for (int i = 0; i < n; i++)
    28.             {
    29.                 Console.WriteLine(myQ.Dequeue());
    30.             }
    31.             Console.WriteLine();
    32.             Console.WriteLine("Press Enter to Exit");
    33.             //The Console.Readline will pause the program until you
    34.             //press [ENTER]. Then it will exit.
    35.             Console.ReadLine();
    36.         }
    37.     }
    38. }

    Mình sửa lại code bài trên, ok rùi.
    Mình cũng mới bắt đầu học Queue, các bạn có ví dụ nào cho mình học cùng nhé!

    Ví dụ tiếp theo:

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5.  
    6. namespace Queue3
    7. {
    8.     class Program
    9.     {
    10.         static void Main(string[] args)
    11.         {
    12.             // New Queue of integers
    13.             Queue<int> q = new Queue<int>();
    14.             q.Enqueue(5);
    15.             q.Enqueue(10);
    16.             q.Enqueue(15);
    17.             q.Enqueue(20);
    18.  
    19.             // Create new array with Length equal to Queue's element count.
    20.             int[] arr = new int[q.Count];
    21.  
    22.             // Copy the Queue to the int array.
    23.             q.CopyTo(arr, 0);
    24.  
    25.             // Loop through and display int[] in order
    26.             for (int i = 0; i < arr.Length; i++)
    27.             {
    28.                 Console.WriteLine(arr[i]);
    29.             }
    30.  
    31.             // Loop through int array in reverse order
    32.             for (int i = arr.Length - 1; i >= 0; i--)
    33.             {
    34.                 Console.WriteLine(arr[i]);
    35.             }
    36.             Console.Read();
    37.  
    38.         }
    39.     }
    40. }

    Ví dụ:
    Visual C# Code:
    1. using System;
    2. using System.Collections;
    3. using System.Windows.Forms;
    4. using System.Drawing;
    5.  
    6. class QueueDemo : Form
    7. {
    8.     static Queue simpleQueue;
    9.     Button btnEnQueue, btnPeek, btnDeQueue;
    10.     TextBox txtItem;
    11.     Label lblItem, lblQueue;
    12.     ListBox lstQueueUI;
    13.  
    14.     public QueueDemo()
    15.     {
    16.         simpleQueue = new Queue(32);
    17.         lblItem = new Label();
    18.         lblItem.Text = "Item To Add";
    19.         lblItem.Location = new Point(16, 16);
    20.         lblItem.AutoSize = true;
    21.  
    22.         txtItem = new TextBox();
    23.         txtItem.Location = new Point(lblItem.Right + 8, lblItem.Top);
    24.         txtItem.Size = new Size(256, 27);
    25.  
    26.         btnEnQueue = new Button();
    27.         btnEnQueue.Size = btnEnQueue.Size;
    28.         btnEnQueue.Location = new Point(txtItem.Right + 8, lblItem.Top);
    29.         btnEnQueue.Text = "EnQueue";
    30.         btnEnQueue.Click += new EventHandler(btnEnQueue_Click);
    31.  
    32.         btnPeek = new Button();
    33.         btnPeek.Size = btnEnQueue.Size;
    34.         btnPeek.Location = new Point(btnEnQueue.Right + 8, lblItem.Top);
    35.         btnPeek.Text = "Peek";
    36.         btnPeek.Click += new EventHandler(btnPeek_Click);
    37.  
    38.         btnDeQueue = new Button();
    39.         btnDeQueue.Size = btnEnQueue.Size;
    40.         btnDeQueue.Location = new Point(btnPeek.Right + 8, lblItem.Top);
    41.         btnDeQueue.Text = "DeQueue";
    42.         btnDeQueue.Click += new EventHandler(btnDeQueue_Click);
    43.  
    44.         lblQueue = new Label();
    45.         lblQueue.Location = new Point(lblItem.Left, lblItem.Bottom + 32);
    46.         lblQueue.Text = "Visual Queue";
    47.  
    48.         lstQueueUI = new ListBox();
    49.         lstQueueUI.Location = new Point(lblItem.Left, lblQueue.Bottom + 16);
    50.         lstQueueUI.Size = new Size(512, 256);
    51.  
    52.         this.Text = "Queue Demo";
    53.         this.Controls.AddRange(new Control[]
    54.             {
    55.                 lblItem,txtItem,
    56.                 btnEnQueue,btnPeek,btnDeQueue,
    57.                 lblQueue,lstQueueUI
    58.             });
    59.     }
    60.  
    61.     void btnEnQueue_Click(object sender, EventArgs e)
    62.     {
    63.         if (txtItem.Text.Trim() != String.Empty)
    64.         {
    65.             simpleQueue.Enqueue(txtItem.Text.Trim());
    66.             lstQueueUI.Items.Insert(lstQueueUI.Items.Count,
    67. "Added Element: " + txtItem.Text.Trim() + " At " + DateTime.Now.ToString());
    68.         }
    69.         else
    70.         {
    71.             MessageBox.Show("Empty Value Cannot be Added", "QueueDemo",
    72. MessageBoxButtons.OK, MessageBoxIcon.Information);
    73.         }
    74.     }
    75.  
    76.     void btnPeek_Click(object sender, EventArgs e)
    77.     {
    78.         try
    79.         {
    80.             MessageBox.Show("Peek Element: "
    81. + simpleQueue.Peek().ToString());
    82.         }
    83.         catch (Exception ex)
    84.         {
    85.             MessageBox.Show("Error: " + ex.Message, "QueueDemo",
    86. MessageBoxButtons.OK, MessageBoxIcon.Error);
    87.         }
    88.     }
    89.  
    90.     void btnDeQueue_Click(object sender, EventArgs e)
    91.     {
    92.         try
    93.         {
    94.             MessageBox.Show("Removed Element: " +
    95.  
    96. simpleQueue.Dequeue().ToString());
    97.             lstQueueUI.Items.RemoveAt(0);
    98.         }
    99.         catch (Exception ex)
    100.         {
    101.             MessageBox.Show("Error: " + ex.Message, "QueueDemo",
    102. MessageBoxButtons.OK, MessageBoxIcon.Error);
    103.         }
    104.     }
    105.  
    106.     static void Main()
    107.     {
    108.         Application.Run(new QueueDemo());
    109.     }
    110. }

    Ví dụ:
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5.  
    6. namespace queueEnumeratorEG
    7. {
    8.     class Program
    9.     {
    10.         static void Main(string[] args)
    11.         {
    12.             // Add integers to queue.
    13.             Queue<int> collection = new Queue<int>();
    14.             collection.Enqueue(5);
    15.             collection.Enqueue(6);
    16.  
    17.             // Loop through queue.
    18.             foreach (int value in collection)
    19.             {
    20.                 Console.WriteLine(value);
    21.             }
    22.             Console.Read();
    23.         }
    24.     }
    25. }

Các đề tài tương tự

  1. Bài tập C++ Sử dụng queue để biểu diễn số thực r có phần nguyên bằng 0 trong hệ nhị phân.
    Gửi bởi Thien Phuc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 03-03-2011, 10:24 PM
  2. hiện tương đầy ảo trong hàng đợi Queue
    Gửi bởi chiaki_6761 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 09-01-2011, 11:30 PM
  3. Bài tập C++ Xây dựng lớp queue trong lập trình C?
    Gửi bởi dang.n.hieu trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 25-10-2010, 03:21 PM
  4. Kỹ thuật C++ Xây dựng Queue trong C++ bằng DSLK.
    Gửi bởi newbie.blind trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 18-08-2010, 08:21 PM
  5. Queue trong hướng đối tượng
    Gửi bởi vinhhung6101989 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 23-10-2009, 12:45 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn