#include<stdio.h>
#include<stdlib.h>
#define M 500
struct sqstack //定义储存运算符的栈
{
char data[M];
int top;
};
int initstack(struct sqstack *s) //构造一个空栈
{
s->top=-1;
return 1;
}
int stackempty(struct sqstack *s) //判栈空
{
return((s->top==-1)? 1:0);
}
int stackfull(struct sqstack *s) //判满栈
{
return((s->top==M-1)? 1:0);
}
int push(struct sqstack *s,char e) //入栈
{
if(stackfull(s))
return 0;
s->top++;
s->data[s->top]=e;
return 1;
}
char pop(struct sqstack *s) //出栈
{
char e;
if(stackempty(s))
return 0;
e=s->data[s->top];
s->top--;
return e;
}
char gettop(struct sqstack *s) //得到栈顶元素
{
char e;
if(stackempty(s))
return 0;
e=s->data[s->top];
return e;
}
float mi(int x,int y) //求x的y次幂
{
float n;
if(y==0)
n=1;
if(y>0)
n=mi(x,y-1)*x;
if(y<0)
n=mi(x,y+1)/x;
return n;
}
float operate(float a,float b,char ch) //运算操作
{
if(ch=='+')
return a+b;
else if(ch=='-')
return a-b;
else if(ch=='/')
return a/b;
else if(ch=='*')
return a*b;
else
return 0;
}
int isoperate(char ch) //判断运算符
{
if(ch=='('||ch==')')
return 1;
else if(ch=='+'||ch=='-')
return 1;
else if(ch=='*'||ch=='/')
return 1;
else
return 0;
}
int isnum(char ch) //判断数字
{
if((ch>='0'&&ch<='9')||ch=='.')
return 1;
else
return 0;
}
char precede(char a,char b) //判断优先级
{
if(a=='+'||a=='-')
{
if(b=='*'||b=='/')
return '<';
else if(b=='(')
return '<';
else
return '>';
}
else if(a=='*'||a=='/')
{
if(b=='(')
return '<';
else
return '>';
}
else if(a=='(')
{
if(b==')')
return '=';
else
return '<';
}
else if(a==')')
return '>';
else if(a=='#')
{
if(b=='#')
return '=';
else
return '<';
}
else
return 0;
}
int check(char c) //得出某运算符前面还有几个运算符
{
if(c=='+'||c=='-')
return 1;
else if(c=='*'||c=='/')
return 1;
else
return 0;
}
int main()
{
struct sqstack S;
char a[M]; //存储输入
char ch='c';
char b[M]; //存储运算符
char c[M]; //存储数据
char cn='A',theta; //theta存放运算符
float d[M]; //存放数据
int i=0,j;
int m=0; //统计运算符数量
int n=0; //存放键盘输入字符数
int k=-1;
int flag=1000; //浮点数分别实数标志
float x=0; //临时存放数据变量
int y=0; //在浮点型与
int z=0; //统计数据数目
int count=0;
float a1=0.0,b1=0.0;
initstack(&S);
while(ch!='\n') //输入放到数组a
{
ch=getchar();
a[i]=ch;
i++;
}
for(j=0;j<i-1;j++)
{
ch=a[j];
if(isoperate(ch))
{
b[m]=ch; //运算符放到数组b
m++;
}
if(isnum(ch))
{
c[n]=ch; //存放0到9以及小数点,每一个数据输入一个空格
n++;
if(isoperate(a[j+1]))
{
c[n]=' ';
n++;
}
}
}
c[n]=' ';
for(j=0;j<n+1;j++)
{
if(c[j]=='.')
flag=j; //小数点位置
if(flag!=1000&&c[j]==' ')
{
for(i=k+1;i<j;i++) //浮点数
{
if(i<flag&&c[i]>48)
x=x+mi(10,flag-i-1)*(c[i]-48);
if(i>flag&&c[i]>48)
x=x+mi(10,flag-i)*(c[i]-48);
k=j;
}
d[z]=x; //数据放入数组d
x=0.0; //x重新置0
z++;
flag=1000;
y=1;
}
if(flag==1000&&c[j]==' '&&y==0) //实数
{
for(i=k+1;i<j;i++)
{
x=x+mi(10,(j-i-1))*(c[i]-48);
k=j;
}
d[z]=x;
x=0.0;
z++;
}
y=0;
}
b[m]='#';
push(&S,'#');
i=0;
ch=b[i++]; //读取运算符
while(ch!='#'||gettop(&S)!='#')
{
switch(precede(gettop(&S),ch))
{
case '<': //栈顶运算符优先级低
{
push(&S,ch);
ch=b[i++];
break;
}
case '=': //优先级相同
{
cn=pop(&S);
ch=b[i++];
break;
}
case '>': //栈顶优先级高
{
theta=pop(&S);
j=S.top;
count=0;
for(n=0;n<=j;n++)
{
if(check(S.data[n]))
count++;
}
a1=d[count]; //读入数据
b1=d[count+1];
d[count]=operate(a1,b1,theta);
for(;count<z-2;count++)
d[count+1]=d[count+2]; //向前覆盖数据
break;
}
}
}
printf("%.2f\n",d[0]);
system("PAUSE");
return 0;
}
#include<stdlib.h>
#define M 500
struct sqstack //定义储存运算符的栈
{
char data[M];
int top;
};
int initstack(struct sqstack *s) //构造一个空栈
{
s->top=-1;
return 1;
}
int stackempty(struct sqstack *s) //判栈空
{
return((s->top==-1)? 1:0);
}
int stackfull(struct sqstack *s) //判满栈
{
return((s->top==M-1)? 1:0);
}
int push(struct sqstack *s,char e) //入栈
{
if(stackfull(s))
return 0;
s->top++;
s->data[s->top]=e;
return 1;
}
char pop(struct sqstack *s) //出栈
{
char e;
if(stackempty(s))
return 0;
e=s->data[s->top];
s->top--;
return e;
}
char gettop(struct sqstack *s) //得到栈顶元素
{
char e;
if(stackempty(s))
return 0;
e=s->data[s->top];
return e;
}
float mi(int x,int y) //求x的y次幂
{
float n;
if(y==0)
n=1;
if(y>0)
n=mi(x,y-1)*x;
if(y<0)
n=mi(x,y+1)/x;
return n;
}
float operate(float a,float b,char ch) //运算操作
{
if(ch=='+')
return a+b;
else if(ch=='-')
return a-b;
else if(ch=='/')
return a/b;
else if(ch=='*')
return a*b;
else
return 0;
}
int isoperate(char ch) //判断运算符
{
if(ch=='('||ch==')')
return 1;
else if(ch=='+'||ch=='-')
return 1;
else if(ch=='*'||ch=='/')
return 1;
else
return 0;
}
int isnum(char ch) //判断数字
{
if((ch>='0'&&ch<='9')||ch=='.')
return 1;
else
return 0;
}
char precede(char a,char b) //判断优先级
{
if(a=='+'||a=='-')
{
if(b=='*'||b=='/')
return '<';
else if(b=='(')
return '<';
else
return '>';
}
else if(a=='*'||a=='/')
{
if(b=='(')
return '<';
else
return '>';
}
else if(a=='(')
{
if(b==')')
return '=';
else
return '<';
}
else if(a==')')
return '>';
else if(a=='#')
{
if(b=='#')
return '=';
else
return '<';
}
else
return 0;
}
int check(char c) //得出某运算符前面还有几个运算符
{
if(c=='+'||c=='-')
return 1;
else if(c=='*'||c=='/')
return 1;
else
return 0;
}
int main()
{
struct sqstack S;
char a[M]; //存储输入
char ch='c';
char b[M]; //存储运算符
char c[M]; //存储数据
char cn='A',theta; //theta存放运算符
float d[M]; //存放数据
int i=0,j;
int m=0; //统计运算符数量
int n=0; //存放键盘输入字符数
int k=-1;
int flag=1000; //浮点数分别实数标志
float x=0; //临时存放数据变量
int y=0; //在浮点型与
int z=0; //统计数据数目
int count=0;
float a1=0.0,b1=0.0;
initstack(&S);
while(ch!='\n') //输入放到数组a
{
ch=getchar();
a[i]=ch;
i++;
}
for(j=0;j<i-1;j++)
{
ch=a[j];
if(isoperate(ch))
{
b[m]=ch; //运算符放到数组b
m++;
}
if(isnum(ch))
{
c[n]=ch; //存放0到9以及小数点,每一个数据输入一个空格
n++;
if(isoperate(a[j+1]))
{
c[n]=' ';
n++;
}
}
}
c[n]=' ';
for(j=0;j<n+1;j++)
{
if(c[j]=='.')
flag=j; //小数点位置
if(flag!=1000&&c[j]==' ')
{
for(i=k+1;i<j;i++) //浮点数
{
if(i<flag&&c[i]>48)
x=x+mi(10,flag-i-1)*(c[i]-48);
if(i>flag&&c[i]>48)
x=x+mi(10,flag-i)*(c[i]-48);
k=j;
}
d[z]=x; //数据放入数组d
x=0.0; //x重新置0
z++;
flag=1000;
y=1;
}
if(flag==1000&&c[j]==' '&&y==0) //实数
{
for(i=k+1;i<j;i++)
{
x=x+mi(10,(j-i-1))*(c[i]-48);
k=j;
}
d[z]=x;
x=0.0;
z++;
}
y=0;
}
b[m]='#';
push(&S,'#');
i=0;
ch=b[i++]; //读取运算符
while(ch!='#'||gettop(&S)!='#')
{
switch(precede(gettop(&S),ch))
{
case '<': //栈顶运算符优先级低
{
push(&S,ch);
ch=b[i++];
break;
}
case '=': //优先级相同
{
cn=pop(&S);
ch=b[i++];
break;
}
case '>': //栈顶优先级高
{
theta=pop(&S);
j=S.top;
count=0;
for(n=0;n<=j;n++)
{
if(check(S.data[n]))
count++;
}
a1=d[count]; //读入数据
b1=d[count+1];
d[count]=operate(a1,b1,theta);
for(;count<z-2;count++)
d[count+1]=d[count+2]; //向前覆盖数据
break;
}
}
}
printf("%.2f\n",d[0]);
system("PAUSE");
return 0;
}