中缀表达式转后缀表达式(逆波兰表达式)

来源:互联网 发布:什么英语听力软件最好 编辑:程序博客网 时间:2024/06/05 02:36
#include<iostream>


int main(){
int op_top=-1;
int data_top=-1;
double data[100]={0};
char optr[100]={0};

char nibolan[300];//逆波兰的字符串
int NL=-1;//用于记录逆波兰的下标

char a[]="3.0*(4.0+2.0)/2.0-5.0";//中缀表达式


printf("%d\n",sizeof(a));

int flag=1;//标记是不是负号
for(int i=0;i<sizeof(a)-1;i++){// 遍历字符串转化为逆波兰
switch(a[i]){
case '(':
printf("%c\n",a[i]);
op_top++;
optr[op_top]=a[i];
flag=1;
break;
case ')':
printf("%c\n",a[i]);
if(op_top!=-1){
while(optr[op_top]!='('){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
}
op_top--;
flag=0;
break;
case '+':
case '-':
printf("%c\n",a[i]);
if(flag==1){
if(a[i]=='-'){
op_top++;
optr[op_top]='@';
}
break;
}
while(op_top!=-1&&optr[op_top]!='('){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
op_top++;
optr[op_top]=a[i];
flag=0;
break;
case '*':
case '/':
printf("%c\n",a[i]);
if(op_top!=-1){
while(optr[op_top]=='*'||optr[op_top]=='/'){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
}
op_top++;
optr[op_top]=a[i];
flag=0;
break;
default:
printf("%c\n",a[i]);
if(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
while(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
}
if(a[i]=='.'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
while(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
}
}
}
i--;
NL++;
nibolan[NL]='#';
flag=0;
break;
}
}
while(op_top!=-1){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
for(i=0;i<=NL;i++){
printf("%c",nibolan[i]);
}
printf("\n");
printf("%d\n",NL);

double d=0;
double x=0.1;
for(i=0;i<=NL;i++){
switch(nibolan[i]){
case '+':
data[data_top-1]=data[data_top-1]+data[data_top];
data_top--;
break;
case '-':
data[data_top-1]=data[data_top-1]-data[data_top];
data_top--;
break;
case '*':
data[data_top-1]=data[data_top-1]*data[data_top];
data_top--;
break;
case '/':
if(data[data_top]==0){
printf("表达式有错误,除数不能为零\n");
}else{
data[data_top-1]=data[data_top-1]/data[data_top];
data_top--;
}
break;
case '@':
data[data_top]=-(data[data_top]);
break;
default:
d=0;
while(nibolan[i]>='0'&&nibolan[i]<='9'){
d=d*10+(nibolan[i]-'0');
i++;
}
x=0.1;
if(nibolan[i]=='.'){
i++;
while(nibolan[i]>='0'&&nibolan[i]<='9'){
d=d+x*(nibolan[i]-'0');
x=x*x;
i++;//这时候是‘#’,跳过
}
}
data_top++;
data[data_top]=d;
break;
}
}


double result=data[data_top];
printf("表达式的结果是:%lf\n",result);
return 0;
}
0 0
原创粉丝点击