Data_Structure/作業/unit3/claude_easy.c

137 lines
3.2 KiB
C
Raw Normal View History

2025-01-20 21:30:53 +08:00
#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;
}