Beispiel #1
0
        //Hàm chuyển từ hậu tố sang trung tố
        private void HauSangTrung(string s, ref string result)
        {
            STACK <string> myStack = new STACK <string>();//Khởi tạo ngăn xếp

            for (int i = 0; i < s.Count(); i++)
            {
                if (LaSoHang(s[i]))//Kiểm tra phần tử có phải là số hang hay không
                {
                    double soHang = 0;
                    while (LaSoHang(s[i]))                           //Xu lý với số hạng lớn hơn hai bằng hai chữ số
                    {
                        soHang = soHang * 10 + (double)(s[i] - '0'); //Xử lý để được một số hạng nếu số hạng đó lớn hơn hai chữ số.
                        i++;                                         //Bước nhảy này nhầm kiểm tra phần tử tiếp theo có phải số hạng hay không
                    }
                    i--;
                    myStack.Push(soHang.ToString()); //Cho chuỗi vào ngăn xếp
                }
                else if (s[i] == ' ')                //' ' dùng để phân cách hai số hạng khác nhau nếu gặp ' ' thì bỏ qua tiếp tục vòng lặp tiếp theo
                {
                    continue;                        //Tiếp tục vòng lặp với i mới
                }
                else//Nếu s[i] là một toán tử thì làm
                {
                    string soHang1 = (string)myStack.Peak(); //Lấy số hạng thứ 1 trong ngăn xếp từ trên xuống
                    myStack.Pop();                           //Hủy bỏ số hạng đầu tiên
                    string soHang2 = (string)myStack.Peak(); //Lấy số hạng thứ 2 trong ngăn xếp
                    myStack.Pop();                           //Hủy bỏ số hạng thứ 2 trong ngăn xếp
                    myStack.Push("(" + soHang2 + s[i] +
                                 soHang1 + ")");             //Cho biểu thức số hạng vào ngăn xếp
                }

                result = (string)myStack.Peak();//Sau khi xử lý bên trên ta được một biểu thức kết quả trong ngăn xếp ....Bây giờ ra gán kết quả đó cho result
            }
        }
Beispiel #2
0
        //Hàm tính giá trị của biểu thức
        private double TinhGiaTriBieuThuc(string result)
        {
            STACK <double> myStack = new STACK <double>();//Khởi tạo ngăn xếp
            int            i;

            for (i = 0; i < result.Count(); i++)
            {
                if (result[i] == ' ')//Nếu gặp ' ' bỏ qua đến vòng lặp tiếp theo
                {
                    continue;
                }
                else if (LaSoHang(result[i]))
                {
                    double soHang = 0;
                    while (LaSoHang(result[i]))                           //Xử lý với số hạng lớn hơn hai bằng hai chữ số
                    {
                        soHang = soHang * 10 + (double)(result[i] - '0'); //Xử lý để được một số hạng nếu số hạng đó lớn hơn hai chữ số.
                        i++;                                              //Bước nhảy này nhầm kiểm tra phần tử tiếp theo có phải số hạng hay không
                    }
                    i--;

                    myStack.Push(soHang);//Cho phần tử vào ngăn xếp
                }
                else
                {
                    double soThu1 = (double)myStack.Pop();
                    double soThu2 = (double)myStack.Pop();
                    switch (result[i])
                    {
                    //Thực hiện tính toán tại sao là soThu2 truoc vi khi cho vao ngan xep thi so dung truoc cho vao truoc nen khi lay
                    //ra thi se lay sau vi the khi tinh toan thi so thu hai dung truoc.
                    case '+':
                        myStack.Push(soThu2 + soThu1);
                        break;

                    case '-':
                        myStack.Push(soThu2 - soThu1);
                        break;

                    case '*':
                        myStack.Push(soThu2 * soThu1);
                        break;

                    case '/':
                        myStack.Push(soThu2 / soThu1);
                        break;

                    case '^':
                        myStack.Push(Math.Pow(soThu2, soThu1));
                        break;
                    }
                }
            }

            return((double)myStack.Pop());//Trả kết quả
        }
Beispiel #3
0
        private void TrungSangHau(string s, ref string result)
        {
            STACK <char> myStack = new STACK <char>(); //Khởi tạo ngăn xếp

            myStack.Push('N');                         //Đặt 'N' là cờ đáy.
            int    length = s.Count();                 //Lấy độ dài của biểu thức
            string ketQua = "";                        //Kết quả

            for (int i = 0; i < length; i++)
            {
                if (LaSoHang(s[i]))    //Kiểm tra nếu phần tử là số hạng
                {
                    ketQua += s[i];    //Cho số đó vào biến kết quả
                }
                else if (s[i] == '(')  //Nếu gặp dấu ngoặc đơn
                {
                    myStack.Push('('); //Cho dấu ngoặc đơn vào ngăn xếp
                }
                else if (s[i] == ')')  //nếu gặp dấu ngoặc đơn đóng kết thúc một biểu thức
                {
                    //Xử lý lấy các dấu còn lại trong biểu thức ưu tiên (trong ngoặc đơn)
                    while ((char)myStack.Peak() != 'N')
                    {
                        char c = (char)myStack.Peak();
                        myStack.Pop();
                        if (c != '(')
                        {
                            ketQua += c;//Thêm toán tử vào biểu thức kết quả
                        }
                    }
                }
                else
                {
                    ketQua += ' ';
                    while ((char)myStack.Peak() != 'N' && LaToanHang(s[i]) <= LaToanHang((char)myStack.Peak())) //Kiểm tra  toán tử ưu tiên
                    {                                                                                           //Nếu trong ngăn xếp lấy ra dâu nhân còn s[i] là - thì thõa man vì phép toán thì nhân chia trước công trừ sau .
                        char c = (char)myStack.Peak();
                        myStack.Pop();
                        ketQua += c;    //Cho toán tử ưu tiên vào kết quả
                    }
                    myStack.Push(s[i]); //Cho toán tử vào ngăn xếp
                }
            }
            //Lấy toán tử còn lại thực hiện
            while ((char)myStack.Peak() != 'N')
            {
                char c = (char)myStack.Peak();
                myStack.Pop();
                ketQua += c; //Cho toan tu con cuối cùng vào biểu thức
            }
            result = ketQua; //Đưa ra kết quả
        }
Beispiel #4
0
 //Hàm khởi tạo cho các thuộc tính
 private void InitField()
 {
     myStack = new STACK <int>();
     rd      = new Random();
     size    = 0;
     nodeX   = 200;
     nodeY   = 502;
     numPush.Select(0, numPush.Value.ToString().Length);
     ptbAbout = new PictureBox()
     {
         Size      = new Size(540, 620),
         Location  = new Point(0, 22),
         BackColor = Color.White,
     };
     ptbAbout.BackgroundImage       = Properties.Resources.about;
     ptbAbout.BackgroundImageLayout = ImageLayout.Center;
     g = pnlCanvas.CreateGraphics();
 }
Beispiel #5
0
 public void InitStack(STACK <T> mS)
 {
     mS.Top = null;
 }