(求任何表达式的值)逆波兰表达式
#include"stdio.h"
#define LEN 20
struct
{
char data[LEN];
int top;
}op;
struct
{
float data[50];
int top;
}st;
void sum(char *b)
{
void qiu(char *);
char result[50];
char ch;
int j=0;
ch=*b++;
op.top=-1;
while(ch!='\0')
{
switch(ch)
{
case '(':
op.top++;
op.data[op.top]=ch;
break;
case ')':
while(op.data[op.top]!='(')
{
result[j++]=op.data[op.top];
op.top--;
}
op.top--;
break;
case '-':
case
'+':
{
while(op.top!=-1&&op.data[op.top]!='(')
{
result[j++]=op.data[op.top];
op.top--;
}
}
op.top++;
op.data[op.top]=ch;
break;
case '*':
case '/':
while(op.top!=-1&&op.data[op.top]!='('&&(op.data[op.top]=='*'||op.data[op.top]=='/'))
{
result[j++]=op.data[op.top];
op.top--;
}
op.top++;
op.data[op.top]=ch;
break;
case ' ': break;
default:
while(ch>='0'&&ch<='9')
{
result[j++]=ch;
ch=*b++;
}
b--;
result[j++]='#';
break;
}
ch=*b++;
}
while(op.top!=-1)
{
result[j]=op.data[op.top];j++;
op.top--;
}
result[j]='\0';
qiu(result);
}
void qiu(char *q)
{
char ch;
float d;
ch=*q++;
st.top=-1;
while(ch!='\0')
{
switch(ch)
{
case '+':
st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];
st.top--;
break;
case '*':
st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];
st.top--;
break;
case '/':
if(st.data[st.top]==0)
{
printf("除数不能为零!!");
break;
}
st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];
st.top--;
break;
case '-':
st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
st.top--;
break;
default:
{
d=0;
while(ch>='0'&&ch<='9')
{
d=10*d+ch-'0';
ch=*q++;
}
st.top++;
st.data[st.top]=d;
}break;
}
ch=*q++;
}
printf("结果是:%5.2f\n",st.data[st.top]);
}
void print()
{
int i=0;
for(;i<50;i++,printf("*"));
puts("");
}
void main()
{
void sum(char *);
char a[50];
print();
printf("输入任何的表达式都可以,只能计算加减乘除!\n");
print();
scanf("%s",a);
sum(a);
}

浙公网安备 33010602011771号