c语言逆波兰计算器程序,C语言实现逆波兰式实例

#include

#include

typedef struct{char s[20][20];int top;}SQ;

void copystr(char *a,char *b)

{

int i=0;

do

{

b[i]=a[i];

i++;

}

while(a[i]!='\0');

b[i]='\0';

}

void voidSQ(SQ *s)

{

s->top=-1;

}

int ifempty(SQ *s)

{

return(s->top==-1);

}

void push(SQ *S,char *c)

{

if(S->top==19)

printf("over flow\n");

else

{

S->top++;

copystr(c,S->s[S->top]);

}

}

char *pop(SQ *S)

{

if(ifempty(S))

{

printf("over flow!\n");

return(NULL);

}

else

return(S->s[S->top--]);

}

int judge(char *c)

{

if(c[1]=='\0')

switch(c[0])

{

case '+':return(3);

case '-':return(3);

case '*':return(2);

case '/':return(2);

default:return(1);

}

else

return(1);

}

void write(char *a,char *b,char *c)

{

strcat(a,c);

strcat(a,b);

}

int seek(char *c,int start)

{

int signal=1;

for(start=start++;c[start]!='\0'&&signal!=0;start++)

{

if(c[start]==')')

signal--;

else if(c[start]=='(')

signal++;

}

if(signal==0)

return(start-1);

else

{

printf("输入无效式子\n");

return(-1);

}

}

void FB(SQ *A,SQ *B)

{

for(;!ifempty(A);)

{

push(B,A->s[A->top]);

pop(A);

}

}

char *rewrite(char *A)

{

SQ front;

SQ back;

int i,j,k,flag=0;

char *result;

char mid[20];

voidSQ(&front);

voidSQ(&back);

for(i=0;A[i]!='\0';)

{

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

{

j=seek(A,i);

for(k=i+1;k

{

mid[k-i-1]=A[k];

}

mid[j-i-1]='\0';

copystr(rewrite(mid),mid);

push(&back,mid);

i=j+1;

}

else if(A[i]!='(')

{

mid[0]=A[i];

mid[1]='\0';

push(&back,mid);

i++;

}

}

FB(&back,&front);

for(;front.top>=2;)

{

flag=0;

for(i=0;i<=front.top;i++)

{

if(judge(front.s[i])==2)

{

flag=1;

break;

}

}

if(flag==1)

{

for(;front.top>=2;)

{

if(judge(front.s[front.top])==1&&judge(front.s[front.top-1])==2&&judge(front.s[front.top-2])==1)

{

write(front.s[front.top],front.s[front.top-1],front.s[front.top-2]);

push(&back,front.s[front.top]);

pop(&front);

pop(&front);

pop(&front);

}

else

{

push(&back,front.s[front.top]);

pop(&front);

}

}

FB(&front,&back);

FB(&back,&front);

}

else

{

for(;front.top>=2;)

{

if(judge(front.s[front.top])==1&&judge(front.s[front.top-1])==3&&judge(front.s[front.top-2])==1)

{

write(front.s[front.top],front.s[front.top-1],front.s[front.top-2]);

push(&back,front.s[front.top]);

pop(&front);

pop(&front);

pop(&front);

}

else

{

push(&back,front.s[front.top]);

pop(&front);

}

}

FB(&front,&back);

FB(&back,&front);

}

}

result=front.s[front.top];

return(result);

}

typedef struct{char c[20];int top;}sq;

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

{

switch(a)

{

case('+'):return((c-48)+(b-48));

case('-'):return((c-48)-(b-48));

case('*'):return((c-48)*(b-48));

case('/'):return((c-48)/(b-48));

}

}

void voidsq(sq *s)

{

s->top=-1;

}

int ifsqempty(sq *s)

{

return(s->top==-1);

}

void pushsq(sq *s,char x)

{

if(s->top==19)

printf("over flow!\n");

else

{

s->top=s->top+1;

s->c[s->top]=x;

}

}

void popsq(sq *s)

{

if(ifsqempty(s))

printf("over flow!\n");

else

s->top--;

}

int just(char c)

{

switch(c)

{

case ('+'):return(0);

case ('-'):return(0);

case ('*'):return(0);

case ('/'):return(0);

default:return(1);

}

}

void restread(sq *a,sq *b)

{

for(;!ifsqempty(a);)

{

pushsq(b,a->c[a->top]);

popsq(a);

}

}

int calculate(char *c)

{

sq rest,read;

int i,re;

voidsq(&rest);

voidsq(&read);

for(i=0;c[i]!='\0';i++)

pushsq(&read,c[i]);

for(;read.top>=2;)

{

for(;read.top>=2;)

{

if(just(read.c[read.top])==0&&just(read.c[read.top-1])==1&&just(read.c[read.top-2]) ==1)

{

re=execute(read.c[read.top],read.c[read.top-1],read.c[read.top-2]);

pushsq(&rest,re+48);

popsq(&read);

popsq(&read);

popsq(&read);

}

else

{

pushsq(&rest,read.c[read.top]);

popsq(&read);

}

}

restread(&read,&rest);

restread(&rest,&read);

}

return(read.c[0]-48);

}

void main()

{

char re[20];

char a[20];

printf("请输入算式:\n");

scanf("%s",a);

copystr(rewrite(a),re);

printf("逆波兰式:\n%s\n",re);

printf("求值结果:\n%d\n",calculate(re));

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值