Ejemplo n.º 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
            }
        }
Ejemplo n.º 2
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ả
        }