137 lines
3.2 KiB
C
137 lines
3.2 KiB
C
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#define MAX 100
|
|||
|
|
|||
|
// <20>ŧi<C5A7><69><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD>
|
|||
|
char input[MAX]; // <20>x<EFBFBD>s<EFBFBD><73><EFBFBD>J<EFBFBD><4A><EFBFBD>⦡
|
|||
|
char stack[MAX]; // <20>ΨӼȦs<C8A6>B<EFBFBD><42><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD>|
|
|||
|
int top = -1; // <20><><EFBFBD>|<7C><><EFBFBD><EFBFBD><EFBFBD>ݦ<EFBFBD><DDA6>m
|
|||
|
|
|||
|
// === <20><><EFBFBD>|<7C><><EFBFBD>ާ@ ===
|
|||
|
void push(char c) {
|
|||
|
top++;
|
|||
|
stack[top] = c;
|
|||
|
}
|
|||
|
|
|||
|
char pop() {
|
|||
|
char c = stack[top];
|
|||
|
top--;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
// === <20>ˬd<CBAC>B<EFBFBD><42><EFBFBD>l<EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ===
|
|||
|
int get_priority(char op) {
|
|||
|
switch(op) {
|
|||
|
case '+':
|
|||
|
case '-':
|
|||
|
return 1;
|
|||
|
case '*':
|
|||
|
case '/':
|
|||
|
return 2;
|
|||
|
case '^':
|
|||
|
return 3;
|
|||
|
case 'n': // <20>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>dz̰<C7B3>
|
|||
|
return 4;
|
|||
|
default:
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// === <20>ˬd<CBAC>r<EFBFBD><72><EFBFBD>O<EFBFBD>_<EFBFBD><5F><EFBFBD>B<EFBFBD><42><EFBFBD>l ===
|
|||
|
int is_operator(char c) {
|
|||
|
return (c == '+' || c == '-' || c == '*' || c == '/' || c == '^');
|
|||
|
}
|
|||
|
|
|||
|
// === <20>ˬd<CBAC>O<EFBFBD>_<EFBFBD><5F><EFBFBD>t<EFBFBD><74> ===
|
|||
|
int is_negative_sign(char *expr, int pos) {
|
|||
|
// <20>p<EFBFBD>G<EFBFBD>O<EFBFBD>Ĥ@<40>Ӧr<D3A6><72><EFBFBD>A<EFBFBD>N<EFBFBD>O<EFBFBD>t<EFBFBD><74>
|
|||
|
if (pos == 0) return 1;
|
|||
|
|
|||
|
// <20>ˬd<CBAC>e<EFBFBD>@<40>ӫD<D3AB>ťզr<D5A6><72>
|
|||
|
int prev = pos - 1;
|
|||
|
while (prev >= 0 && expr[prev] == ' ') prev--;
|
|||
|
|
|||
|
if (prev < 0) return 1; // <20>p<EFBFBD>G<EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>ťաA<D5A1>]<5D>O<EFBFBD>t<EFBFBD><74>
|
|||
|
|
|||
|
// <20>p<EFBFBD>G<EFBFBD>e<EFBFBD>@<40>Ӧr<D3A6><72><EFBFBD>O<EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>Υ<EFBFBD><CEA5>A<EFBFBD><41><EFBFBD>A<EFBFBD>N<EFBFBD>O<EFBFBD>t<EFBFBD><74>
|
|||
|
return (is_operator(expr[prev]) || expr[prev] == '(');
|
|||
|
}
|
|||
|
|
|||
|
// === <20>D<EFBFBD>n<EFBFBD>ഫ<EFBFBD>禡 ===
|
|||
|
void convert_to_postfix() {
|
|||
|
int i = 0;
|
|||
|
|
|||
|
printf("<EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܪk<EFBFBD>G");
|
|||
|
|
|||
|
while(input[i] != '\0') {
|
|||
|
char now = input[i];
|
|||
|
|
|||
|
// <20>B<EFBFBD>z<EFBFBD>Ʀr<C6A6>]<5D>]<5D>t<EFBFBD>t<EFBFBD>ơ^
|
|||
|
if (now >= '0' && now <= '9') {
|
|||
|
printf("%c", now);
|
|||
|
while(input[i+1] >= '0' && input[i+1] <= '9') {
|
|||
|
i++;
|
|||
|
printf("%c", input[i]);
|
|||
|
}
|
|||
|
printf(" ");
|
|||
|
}
|
|||
|
// <20>B<EFBFBD>z<EFBFBD>t<EFBFBD><74>
|
|||
|
else if (now == '-' && is_negative_sign(input, i)) {
|
|||
|
push('n'); // <20>ϥίS<CEAF><53><EFBFBD>r<EFBFBD><72>'n'<27><><EFBFBD>ܭt<DCAD><74>
|
|||
|
i++;
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>Ʀr<C6A6><72><EFBFBD><EFBFBD>
|
|||
|
while(input[i] >= '0' && input[i] <= '9') {
|
|||
|
printf("%c", input[i]);
|
|||
|
i++;
|
|||
|
}
|
|||
|
printf(" ");
|
|||
|
// <20><><EFBFBD>X<EFBFBD>t<EFBFBD><74>
|
|||
|
printf("-");
|
|||
|
i--; // <20>^<5E>h<EFBFBD>@<40>Ӧ<EFBFBD><D3A6>m<EFBFBD>A<EFBFBD>]<5D><>while<6C>`<60><><EFBFBD>ٷ|<7C>[<5B>@
|
|||
|
}
|
|||
|
// <20>B<EFBFBD>z<EFBFBD><7A><EFBFBD>A<EFBFBD><41>
|
|||
|
else if(now == '(') {
|
|||
|
push(now);
|
|||
|
}
|
|||
|
// <20>B<EFBFBD>z<EFBFBD>k<EFBFBD>A<EFBFBD><41>
|
|||
|
else if(now == ')') {
|
|||
|
while(top >= 0 && stack[top] != '(') {
|
|||
|
char op = pop();
|
|||
|
printf("%c ", op == 'n' ? ' ' : op);
|
|||
|
}
|
|||
|
if(top >= 0) {
|
|||
|
pop(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41>
|
|||
|
}
|
|||
|
}
|
|||
|
// <20>B<EFBFBD>z<EFBFBD>B<EFBFBD><42><EFBFBD>l
|
|||
|
else if(is_operator(now)) {
|
|||
|
while(top >= 0 && get_priority(stack[top]) >= get_priority(now)) {
|
|||
|
char op = pop();
|
|||
|
printf("%c ", op == 'n' ? ' ' : op);
|
|||
|
}
|
|||
|
push(now);
|
|||
|
}
|
|||
|
|
|||
|
i++;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>X<EFBFBD><58><EFBFBD>|<7C><><EFBFBD>ѤU<D1A4><55><EFBFBD>Ҧ<EFBFBD><D2A6>B<EFBFBD><42><EFBFBD>l
|
|||
|
while(top >= 0) {
|
|||
|
char op = pop();
|
|||
|
printf("%c ", op == 'n' ? ' ' : op);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int main() {
|
|||
|
printf("=== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǭp<C7AD><70><EFBFBD><EFBFBD> ===\n");
|
|||
|
printf("<EFBFBD>o<EFBFBD>ӵ{<7B><><EFBFBD>i<EFBFBD>H<EFBFBD><48><EFBFBD>@<40>몺<EFBFBD>⦡<EFBFBD>ഫ<EFBFBD><E0B4AB><EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><C7AA>ܪk\n");
|
|||
|
printf("<EFBFBD>i<EFBFBD>H<EFBFBD>ϥΪ<EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD>G+, -, *, /, ^, (, )\n");
|
|||
|
printf("<EFBFBD>п<EFBFBD><EFBFBD>J<EFBFBD>⦡<EFBFBD>G");
|
|||
|
|
|||
|
gets(input);
|
|||
|
convert_to_postfix();
|
|||
|
|
|||
|
printf("\n");
|
|||
|
return 0;
|
|||
|
}
|