#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
#include<math.h>
#include<string.h>
#define N 25 //最大表达式长度
#define OP 1 //OP为运算符,值为1
#define NUM 0 //NUM为数字,值为0
#define MAXSIZE 100
typedef char datatype;
typedef struct{
datatype a[MAXSIZE];
int top;
}sequence_stack;
void init(sequence_stack *st)//栈初始化
{
st->top=0;
}
int empty(sequence_stack st)//判断栈是否为空
{
return(st.top?0:1);
}
datatype read(sequence_stack st)//读栈顶结点值
{
if(empty(st))
{
printf("\n栈是空的!");exit(1);
}
else return st.a[st.top-1];
}
void push(sequence_stack *st,datatype x)//进栈
{
if(st->top==MAXSIZE)
{
printf("\nThe sequence stack is full!");exit(1);
}
st->a[st->top]=x;
st->top++;
}
void pop(sequence_stack *st)//出栈
{
if(st->top==0)
{
printf("\nThe sequence stack is empty!");exit(1);
st->top--;
}
}
int match_kuohao(char c[])//判断表达式括号是否匹配
{
int i=0;
sequence_stack s;
init(&s);
while(c[i]!='#')
{
switch(c[i])
{
case'{':
case'[':
case'(':push(&s,c[i]);break;
case'}':if(!empty(s)&&read(s)=='{')
{
pop(&s);break;
}
else return 0;
case']':if(!empty(s)&&read(s)=='[')
{
pop(&s);break;
}
else return 0;
case')':if(!empty(s)&&read(s)=='(')
{
pop(&s);break;
}
else return 0;
}
i++;
}
return(empty(s));
}
double readnumber(char f[],int *i)//将数字字符串转变成相应的数
{
double x=0.0;
int k=0;
while(f[*i]>='0'&&f[*i]<='9')
{
x=x*10+(f[*i]-'0');
(*i)++;
}
if(f[*i]=='.')
{
(*i)++;
while(f[*i]>='0'&&f[*i]<='9')
{
x=x*10+(f[*i]-'0');
(*i)++;k++;
}
}
while (k!=0)
{
x=x/10.0;
k=k-1;
}
return(x);
}
double qiuzhi(char f[])//求一个后缀表达式的值
{
double obst[100];
int top=0;
int i=0;
double x1,x2;
while(f[i]!='#')
{
if (f[i]>='0'&&f[i]<='9')
{
obst[top]=readnumber(f,&i);top++;
}
else if(f[i]==' ') i++;
else if(f[i]=='+')
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1+x2;top++;
i++;
}
else if (f[i]=='-')
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1-x2;top++;
i++;
}
else if (f[i]=='*')
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1*x2;top++;
i++;
}
else if (f[i]=='/')
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1/x2;top++;
i++;
}
}
return obst[0];
}
int is_op(char op)//判断一个字符是否为操作符
{
switch(op)
{
case '+':
case '-':
case '*':
case '/':return 1;
default:return 0;
}
}
int youxianji(char op)//求运算符的优先级
{
switch(op)
{
case '#':return -1;
case '(':return 0;
case '+':
case '-':return 1;
case '*':
case '/':return 2;
default:return -1;
}
}
void z_h(char e[],char f[])//将一个中缀表达式e转换为它等价的后缀表达式
{ int i=0;
int j=0;
char opst[100];
int top,t;
top=0;
opst[100]='#';top++;
while(e[i]!='#')
{
if((e[i]>='0'&&e[i]<='9')||e[i]=='.')
f[j++]=e[i];
else if(e[i]=='(')
{
opst[top]=e[i];top++;
}
else if(e[i]==')')
{
t=top-1;
while (opst[t]!='(')
{
f[j++]=opst[--top];t=top-1;
}
top--;
}
else if(is_op(e[i]))
{
f[j++]=' ';
while (youxianji(opst[top-1])>=youxianji(e[i]))
f[j++]=opst[--top];
opst[top]=e[i];top++;
}
i++;
}
while (top) f[j++]=opst[--top];
}
void main()
{
system("cls");
system("color 9F");
sequence_stack s;
init(&s);
char f[100];
char e[100];
datatype ch;
double x;
int k=0;int i;int j;
printf("请输入表达式:");
for(i=0;(ch=getchar())!='\n'&&k<=N;i++)
{
e[i]=ch;
push(&s,ch);
k++;
}
e[i+1]='#';
printf("显示表达式:");
for(i=0;e[i]!='#';i++)
{printf("%f",e[i]);}
z_h(e,f);
readnumber(f,&j);
x=qiuzhi(f);
printf("表达式的结果为:",x);
}