1.题目:
中缀表示: a+b-a*((c+d)/e-f)+g--------将中缀变为后缀:
分析过程如图所示:
具体代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *s="a+b-a*((c+d)/e-f)+g";
char m[30];
char stack[10];
int n=-1;
int DM(char s){
if(s=='+'||s=='-'){
return 1;
}
if(s=='*'||s=='/'){
return 2;
}
if(s=='('){
return 0;
}
}
int send(char *s,int *top){
if('a'<=*s&&*s<='z'){
m[++n]=*s;
}else if(*top==-1){
stack[++(*top)]=*s;
} else if(*s=='+'||*s=='-'||*s=='*'||*s=='/'){
if(DM(*s)<=DM(stack[*top])){
m[++n]=stack[(*top)--];
send(s,top);
}
if(DM(*s)>DM(stack[*top])){
stack[++(*top)]=*s;}
} else if(*s=='('){
stack[++(*top)]=*s;
}else if(*s==')'){
m[++n]=stack[(*top)--];
if(stack[*top]=='('){
(*top)--;
return 0;
}else{
send(s,top);
}
}
return 0;
}
int main(){
int w=-1;
char *a=m;
while(*s!='\0'){
send(s,&w);
s++;
}
while(w!=-1){
m[++n]=stack[w--];
}
printf("%s",m);
return 0;
}
2.题目:
中缀表示: a+b-a*((c+d)/e-f)+g--------将中缀变为前缀:
分析如下: 在中缀->后缀中的基础上分析,思想倒置。 1.从右往左扫描中缀字符串, 2.新建立的字符串也从右往左写入
具体代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *s="?a+b-a*((c+d)/e-f)+g";
char m[20];
char stack[10];
int n=19;
int DM(char s){
if(s=='+'||s=='-'){
return 1;
}
if(s=='*'||s=='/'){
return 2;
}
if(s==')'){
return 0;
}
}
int star(char *s,int *top){
if('a'<=*s&&*s<='z'){
m[n--]=*s;
}else if(*s=='+'||*s=='-'||*s=='*'||*s=='/'){
if(*top==-1){
stack[++(*top)]=*s;
}else if(DM(*s)<DM(stack[*top])){
m[n--]=stack[(*top)--];
star(s,top);
}else if(DM(*s)>=DM(stack[*top])){
stack[++(*top)]=*s;
}
}else if(*s==')'){
stack[++(*top)]=*s;
}else if(*s=='('){
m[n--]=stack[(*top)--];
if(stack[*top]==')'){
(*top)--;
return 0;
}else{
star(s,top);
}
}
return 0;
}
int main(){
int a=0; int top=-1;
while(*s!='\0'){
s++;
}
while(*s!='?'){
s--;
star(s,&top);
}
printf("%d",top);
while(top!=-1){
m[n--]=stack[top--];
}
while(a<20){
printf("%c",m[a]);
a++;
}
return 0;
}
|