中缀表达式变后缀表达式求值c语言文件读取,经典c程序(0031) ---中缀表达式转后缀表达式并求值...

#include

/*******************************************************************************/

#define M 300

char express[M];

char string[M];

int len=0;

/*******************************************************************************/

int express_calc(char *express,int len);

/*******************************************************************************/

typedef struct{

char cstore[M];

int ctop;

}Stack_ct;

void stack_cinit( Stack_ct * A)

{

(*A).ctop=-1;

}

int stack_cpush(Stack_ct * A,char val)

{

if( (*A).ctop==M-1 )// stack full, cannot push

return (-1);

(*A).cstore[ ++((*A).ctop) ]=val;

}

int stack_cpop(Stack_ct *A,char *val)

{

if( (*A).ctop==-1 )// stack empty, cannot pop

return (-1);

*val=(*A).cstore[ ((*A).ctop)-- ];

}

Stack_ct token_store;

/*******************************************************************************/

typedef struct{

int istore[M];

int itop;

}Stack_it;

void stack_iinit( Stack_it *A)

{

(*A).itop=-1;

}

int stack_ipush(Stack_it * A,int val)

{

if( (*A).itop==M-1 )// stack full, cannot push

return (-1);

(*A).istore[ ++((*A).itop) ]=val;

}

int stack_ipop(Stack_it *A,int *val)

{

if( (*A).itop==-1 )// stack empty, cannot pop

return (-1);

*val=(*A).istore[ ((*A).itop)-- ];

}

Stack_it intstore;

/*******************************************************************************/

int comp_pri_before(char x, char y)

{

char token[5]={'+','-','*','/','('};

int before_pri[5]={1,1,2,2,3};

int i=0,a=0,b=0;

for(i=0;i<5;i++)

{

if(x==token[i])

a=i;

if(y==token[i])

b=i;

}

if( before_pri[a] > before_pri[b])

return (1);

else

return (0);

}

/*

int comp_pri_after(char x, char y)

{

char token[5]={'+','-','*','/','('};

int after_pri[5]={1,1,2,2,0};

int i=0,a=0,b=0;

for(i=0;i<5;i++)

{

if(x==token[i])

a=i;

if(y==token[i])

b=i;

}

if( after_pri[a] > after_pri[b])

return (1);

else

return (0);

}

*/

/*******************************************************************************/

int calc(int a, int b, char c)

{

switch(c)

{

case '+':

return (a+b);

case '-':

return (a-b);

case '*':

return (a*b);

case '/':

return (a/b);

default:

;//return NULL;

}

}

/*******************************************************************************/

int main(void)

{

int test_case;

int T=0,th=1;

freopen("input.txt", "r", stdin);

setbuf(stdout, NULL);

//scanf("%d", &T);

T=10;

for(test_case = 0; test_case < T; test_case++)

{

int ret=0;

/**********************************

* Implement your algorithm here. */

scanf("%d",&len);

scanf("%s",express);

ret=express_calc(express,len);

/**********************************/

// Print the answer to standard output(screen).

printf("#%d %d\n",th++,ret);

fflush(stdout);//修复Eclipse printf()不能显示的小bug

}

return (0);//Your program should return 0 on normal termination.

}

int express_calc(char *express,int len)

{

int i=0,j=0,k=0,sum=0,a=0,b=0;

char tmp;

char stoken[14]={'0','1','2','3','4','5','6','7','8','9','+','-','*','/'};

for(i=0;i

string[i]='\0';

stack_cinit( &token_store);

stack_iinit( &intstore);

for(i=0;i

{

if( express[i]>=48 && express[i]<=57)// number

string[k++]=express[i];

else//char

{

if(express[i]==')')

{

tmp=token_store.cstore[token_store.ctop];

while(tmp !='(')

{

stack_cpop(&token_store,&string[k++]);

tmp=token_store.cstore[token_store.ctop];

}

stack_cpop(&token_store,&tmp);

continue;

}

if( token_store.ctop==-1)

stack_cpush(&token_store,express[i]);

else

{

tmp=token_store.cstore[token_store.ctop];

if(tmp=='(')///lost

{

stack_cpush(&token_store,express[i]);

continue;

}

if( comp_pri_before(express[i],tmp) )

stack_cpush(&token_store,express[i]);

else

{

tmp=token_store.cstore[token_store.ctop];

while( ! comp_pri_before(express[i],tmp) )

{

if(token_store.ctop==-1 || tmp=='(')

break;

stack_cpop(&token_store,&string[k++]);

tmp=token_store.cstore[token_store.ctop];

}

stack_cpush(&token_store,express[i]);

}

}

}

}

while(token_store.ctop!=-1)

{

stack_cpop(&token_store,&string[k++]);

}

/

i=0;

for(i=0;i

{

for(j=0;j<14;j++)

{

if( string[i] ==stoken[j] )

break;

}

if(j==14)

break;

if( string[i]>=48 && string[i]<=57 )

stack_ipush(&intstore,string[i]-48);

else{

stack_ipop(&intstore,&a);

stack_ipop(&intstore,&b);

sum=calc(b,a,string[i]);

stack_ipush(&intstore,sum);

}

}

sum=intstore.istore[intstore.itop];

return (sum);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值