#include<stdio.h>
#include<stdlib.h>
#include"zhong.h"
typedef struct
{
char data[100];
int top;
}SeqStack,*PSeqStack;
//栈的基本操作
PSeqStack Init_seqstack()
{
PSeqStack S;
S=(PSeqStack )malloc(sizeof(SeqStack));
if(S)
S->top=-1;
return S;
}
int Empty_Seqstack(PSeqStack S)
{
if(S->top==-1)
return 1;
else
return 0;
}
int Push_seqstack(PSeqStack S,char x)
{
if(S->top==100-1)
return 0;
else
{
S->top++;
S->data[S->top]=x;
return 1;
}
}
int Pop_seqstack(PSeqStack S,char *x)
{
if(Empty_Seqstack(S))
return 0;
else
{
*x=S->data[S->top];
S->top--;
return 1;
}
}
int GetTop_seqstack(PSeqStack S,char *x)
{
if(Empty_Seqstack(S))
return 0;
else
*x=S->data[S->top];
return 1;
}
void Destroy_seqstack(PSeqStack *S)
{
if(*S)
free(*S);
*S=NULL;
return ;
}
//以上是栈的基本操作
int IsNum(char c)
{//判断字符是否是数字
if(c>='0'&&c<='9')
return 1;
else
return 0;
}
int Priority(char op)
{//判断是否是操作符,并定义优先级
switch(op)
{
case '=': return 1;
case ')': return 2;
case '+':
case '-': return 3;
case '*':
case '/': return 4;
case '(': return 5;
default: return 0;
}
}
int infix_exp_value(char *inf,char *pos)
{//中缀转化为后缀表达式
PSeqStack S;
char c,w,topelement;
S=Init_seqstack();//创建一个栈
if(!S)
{
printf("栈的初始化失败!");
return 0;
}
Push_seqstack(S,'=');//将=压入栈中
w=*inf;
while((GetTop_seqstack(S,&c),c)!='='||w!='=')
{//遇到操作数则直接输出,w后移一位
if(IsNum(w))
{
*pos=w;
pos++;
w=*(++inf);
}
else//如果不是操作符,则根据优先级判断是出栈还是圧栈
{
if((GetTop_seqstack(S,&c),c)=='('&&w==')')
{//满足(),则脱括号
Pop_seqstack(S,&topelement);//出栈
w=*(++inf);//w后移
}
else
{
if((GetTop_seqstack(S,&c),c)=='('||Priority((GetTop_seqstack(S,&c),c))<Priority(w))
{//如果栈顶是(或者栈顶优先级小于当前优先级,则当前操作符圧栈
Push_seqstack(S,w);
w=*(++inf);
}
else
{//如果栈顶的优先级大于w的优先级,则出栈
Pop_seqstack(S,&topelement);
*pos=topelement;
pos++;
}
}
}
}
*pos='=';
*(++pos)='\0';
Destroy_seqstack(&S);
return 1;
}
double pos(char *A)
{//后缀表达式计算
PSeqStacki S;
double result,a,b,c;
// char a,b,c;
char ch;
ch=*A++;
S=Init_seqstacki();
while(ch!='=')
{
if(IsNum(ch))
Push_seqstacki(S,ch-'0');
else
{
Pop_seqstacki(S,&a);
Pop_seqstacki(S,&b);
switch(ch)
{
case '+': c=a+b;break;
case '-': c=a-b;break;
case '*': c=a*b;break;
case '/': c=a/b;break;
case '%': c=(int)a%(int)b;break;
}
Push_seqstacki(S,c);
}
ch=*A++;
}
GetTop_seqstacki(S,&result);
Destroy_seqstacki(&S);
return result;
}
int main()
{
char a[100],b[100];
double x;
printf("请输入要计算的表达式:");
scanf("%s",a);
getchar();
infix_exp_value(a,b);
x=pos(b);
printf("%.2lf\n",x);
return 0;
}
栈实现中缀表达式转为后缀表达式
最新推荐文章于 2024-04-06 01:34:32 发布