Data_Structure/作業/unit3/DS3_try.c

117 lines
2.6 KiB
C
Raw Normal View History

2025-01-20 21:30:53 +08:00
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
char infix_q[MAX];
int compare(char stack_o , char infix_o);
void infix_to_postfix();
int get_priority(char c){
if(c=='+' || c=='-'){
return 1;
}else if(c=='*' || c=='/'){
return 2;
}else if(c=='^'){
return 3;
}else{
return 0;
}
}
int main(){
int i=0;
for(i=0;i<MAX;i++){
infix_q[i]='\0';
}
printf("\t--------------------------------------------\n");
printf("\t<EFBFBD><EFBFBD><EFBFBD>ǹB<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǹB<EFBFBD>\n");
printf("\t<EFBFBD>i<EFBFBD>H<EFBFBD>ϥΪ<EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>]<5D>A:^,*,+,-,/,(,) <20><>\n");
printf("\t--------------------------------------------\n");
printf("\t<EFBFBD>п<EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>ǹB<EFBFBD>\n");
infix_to_postfix();
printf("\n");
return 0;
}
int compare(char stack_o,char infix_o){
// char infix_priority[9]={'#',')','+','-','*','/','^',' ','('};
// char stack_priority[8]={'#',')','+','-','*','/','^',' '};
int index_s = 0 ,index_i = 0;
while(stack_priority[index_s]!=stack_o){
index_s++;
}
while(infix_priority[index_i]!=infix_o){
index_i++;
}
return index_s/2 >= index_i/2 ? 1 : 0;
}
void infix_to_postfix() {
int rear = 0, top = 0, flag = 0, i = 0;
char stack_t[MAX];
int tag = 1;
for(i = 0; i < MAX; i++) {
stack_t[i] = '\0';
}
fgets(infix_q, MAX, stdin);
infix_q[strcspn(infix_q, "\n")] = 0;
i = 0;
while(infix_q[i] != '\0') {
i++;
rear++;
}
infix_q[rear] = '#';
printf("\t<EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܪk<EFBFBD>G");
stack_t[top] = '#';
for(flag = 0; flag <= rear; flag++) {
tag = 1;
switch(infix_q[flag]) {
case ')':
while(stack_t[top] != '(') {
printf("%c", stack_t[top--]);
}
top--;
break;
case '#':
while(stack_t[top] != '#') {
printf("%c", stack_t[top--]);
}
break;
case '(':
case '*':
case '/':
case '^':
while(compare(stack_t[top], infix_q[flag]) == 1) {
printf("%c", stack_t[top--]);
}
stack_t[++top] = infix_q[flag];
break;
case '+':
case '-':
if(tag==1){
while(compare(stack_t[top], infix_q[flag]) == 1) {
printf("%c", stack_t[top--]);
}
stack_t[++top] = infix_q[flag];
break;
}else if(tag==2){
}
default:
if(infix_q[flag] != ' ') { // <20><><EFBFBD><EFBFBD><EFBFBD>Ů<EFBFBD>
printf("%c", infix_q[flag]);
}
break;
}
}
}