Cài đặt Stack bằng Array trong C#

Em chào mọi người, em đang học c# và cấu trúc dữ liệu stack . Trong bước cài đặt Stack bằng Array có một số lỗi logic chạy nhưng không thành công nhờ mọi người chỉ giáo ạ. Em cảm ơn

public struct Stack //khởi tạo stack
{
    public int[] data;
    public int top;
}
class Program
{
    public static Boolean IsFull(Stack S)   //kiểm tra stack đầy hay không
    {
        if (S.top == S.data.Length-1)       //vị trí top so với chiều dài của mảng - 1
        {
            return true;
        }
        else
        {
            return false;
        }
        
    }
    public static Boolean IsEmpty(Stack S)  //kiểm tra stack có trống hay không
    {
        if(S.top == -1)                     //top bằng giá trị ban đầu = -1
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public static void Push(Stack S, int x) //đẩy phần tử vào stack
    {
        if (IsFull(S) == false)            //kiểm tra stack có đầy hay không
        {
            S.top++;                       //tăng top lên 1
            S.data[S.top] = x;             //gán x vào vị trí top
        }
        else
        {
            Console.WriteLine("Stack Overflow");
        }

    }
    public static void Pop(Stack S)         //lấy phần tử
    {
        if (IsEmpty(S) == false)            //kiểm tra stack có trống hay không?
        {
            S.top--;                        //giảm top đi 1
        }
        else
        {
            Console.WriteLine("Stack Underflow");
        }
    }
    public static void Peek(Stack S)        //lấy giá trị top
    {
        if (IsEmpty(S) == false)            //kiểm tra stack có trống hay không
        {
            Console.WriteLine("Top Element: " + S.data[S.top]);
        }
        else
        {
            Console.WriteLine("Stack Underflow");
        }
    }
    public static void NumberElement(Stack S)//xuất các phần tử có trong stack
    {
        string str = " ";
        for(int i = S.top; i >= 0; i--)     //gán i từ top đến 0
        {
            str += S.data[i] + " ";
        }
        Console.WriteLine("Element: " + str);
    }
    public static void Main(string[] args)  //hàm main
    {

        Stack S = new Stack();              //khai báo stack
        S.data = new int[3];              //tạo mảng 
        S.top = -1;                         //gán top = -1
        
        Console.WriteLine("==========================");
        Console.WriteLine("|1. Push                  |");
        Console.WriteLine("|2. Pop                   |");
        Console.WriteLine("|3. Show Top Element      |");
        Console.WriteLine("|4. Show Elements in Stack|");
        Console.WriteLine("==========================");
        int numC;
        do
        {
            Console.WriteLine("Choose Option");
            numC = int.Parse(Console.ReadLine());
            switch (numC)
            {
                case 1:
                    Console.WriteLine("Input Number: ");
                    int x = int.Parse(Console.ReadLine());
                    Push(S, x);
                    break;
                case 2:
                    Pop(S);
                    break;
                case 3:
                    Peek(S);
                    break;
                case 4:
                    NumberElement(S);
                    break;

            }
        }
        while (numC < 5);

    }
}

Hi Tin Dinh.
Bạn viết lại theo OOP xem.

1 Like

Có lỗi gì bạn mô tả luôn đi :frowning:

1 Like

biến top trong hàm IsEmpty() không thay đổi sau khi Push bạn :pensive:

không biết C# có vụ reference hay gì gì không, chứ bạn truyền 1 biến Stack vào hàm xong thay đổi giá trị trong hàm thì ra ngoài hàm việc thay đổi giá trị không có ý nghĩa

1 Like

Muốn thay đổi một biến x, ta phải dùng tham chiếu biến/tham chiếu địa chỉ. Nếu tham số là struct (Kiểu dữ liệu tham chiếu giá trị, chẳng hạn như int) thì hàm sẽ tự động tạo bản sao tham trị và tương tác với bản sao đó, còn bản chính thì không ảnh hưởng. Để có thể viết hàm thay đổi biến kiểu struct, bạn phải có toán tử tham chiếu ref:

void Swap(ref int A, ref int B)
{
	int Temp = A;
	A = B;
	B = Temp;
}

Còn các kiểu dữ liệu tham chiếu (class), ví dụ int[] thì khi truyền tham số hàm sẽ truyền tham chiếu địa chỉ nên không dùng toán tử ref

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?