源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C语言实现逆波兰式实例

  • 时间:2021-10-10 16:54 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C语言实现逆波兰式实例
[u]复制代码[/u] 代码如下:
#include<stdio.h> #include<string.h> 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<j;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)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部