//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ả }
//Xử lý sự kiện button Push được nhấn private void btnPush_Click(object sender, EventArgs e) { //Khi số lượng node chưa vượt quá 9: if (size < MAX_SIZE) { // txtHead.Text = ""; nodeY -= 50; selectPush = true; int x = Convert.ToInt32(numPush.Value); myStack.Push(x); txtStack.Text = myStack.PrintStack(); numPush.Focus(); numPush.Select(0, numPush.Value.ToString().Length); // //Đoạn này bắt đầu vẽ DrawNode(myStack.Top); size++; } else { //Ngược lại MessageBox.Show("Stack overflow!", "Notification", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }
//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ả }