//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 } }
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ả }