Đề bài
Đơn giản hóa biểu thức bằng cách xóa dấu ngoặc, xử lý đúng dấu +/- bên trong ngoặc sau dấu trừ.
Ví dụ
(x+y)+(z+q)→x+y+z+q(x-y+z)-p+q→x-y+z-p+q
Thuật toán
- Duyệt chuỗi, sao chép sang chuỗi mới.
- Gặp
(sau-: đảo dấu các toán tử bên trong (+↔-). - Gặp
(sau+hoặc đầu chuỗi: bỏ qua ngoặc, giữ nguyên dấu. - Bỏ qua
).
Chương trình C
#include <stdio.h>
int main() {
int i=0, c=0, j=0;
char a[100], b[100];
printf("Nhập biểu thức: ");
scanf("%s", a);
while(a[i]!='\0') {
if(a[i]=='(' && a[i-1]=='-') {
(c==0)?j=i:j=c;
while(a[i]!=')') {
if(a[i+1]=='+') b[j++]='-';
else if(a[i+1]=='-') b[j++]='+';
else if(a[i+1]!=')') b[j++]=a[i+1];
i++;
}
c=j+1;
}
else if(a[i]=='(' && a[i-1]=='+') {
(c==0)?j=i:j=c;
while(a[i]!=')') { b[j++]=a[i+1]; i++; }
j--; c=j+1;
}
else if(a[i]==')') { i++; continue; }
else { b[j++]=a[i]; }
i++;
}
b[j]='\0';
printf("Kết quả: %s", b);
return 0;
}
Kết quả
Nhập: (x+y)-z Kết quả: x+y-z