用队列计算加减乘除代码

#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define MaxSize 50
typedef double ElemType;
typedef struct linknode
{
    ElemType data;
    ElemType postexp[];
    ElemType exp[MaxSize];
    double *Optr;
    struct linknode *next;
}LinkStNode;
void InitStack(LinkStNode*&s)//初始化 
{
    s=(LinkStNode*)malloc(sizeof(LinkStNode));
    s->next=NULL;
}
void DestroyStack(LinkStNode*&s)//销毁 
{
    LinkStNode *pre=s,*p=s->next;
    while(p!=NULL)
    {
        free(pre);
        pre=p;
        p=p->next ;
    }
    free(pre); 
 } 
 bool StackEmpty(LinkStNode*s)//判断是否为空 
 {
     return(s->next==NULL); 
 }
 void Push(LinkStNode*&s,double e)//进栈  
 {
     LinkStNode *p;
     p=(LinkStNode*)malloc(sizeof(LinkStNode));
     p->data=e;
     p->next=s->next;
     s->next=p;
  } 
bool Pop(LinkStNode*&s,double &e)//出栈  
{
    LinkStNode *p;
    if(s->next==NULL)
return false;
p=s->next;
e=p->data;
s->next=p->next ;
free(p);
return true;
 } 
 bool GetTop(LinkStNode*&s,ElemType &e)//取栈顶元素 
 {
     if(s->next==NULL)
     return false;
     e=s->next->data;
     return true;
  } 
 
//中缀转后缀 
void trans(char *exp,char postexp[])
{
double e;//这里将char换成double 
LinkStNode *Optr;
InitStack (Optr);
int i=0;
while(*exp!='\0')
{
    switch(*exp)
    {
        case '(':
            Push(Optr,'(');
            exp++;
            break;
        case ')':
            Pop(Optr,e);
            while(e!='(')
            {
              postexp[i++]=e;
              Pop(Optr,e);
            }    
            exp++;
            break;
        case '+':
        case '-':
            while (!StackEmpty(Optr)) 
            {
              GetTop(Optr,e);
              if(e!='(')
              {
                postexp[i++]=e;
                Pop(Optr,e);
              }
                else break;
            }
            Push(Optr,*exp);
            exp++;
            break;
        case '*':
        case '/':
            while(!StackEmpty(Optr))        
            {
              GetTop(Optr,e);
              if(e=='*'||e=='/')
                {
                    postexp[i++]=e;
                    Pop(Optr,e);
                }
                else break;
            }    
            Push(Optr,*exp);
            exp++;
            break;
        default:
            while(*exp>='0'&&*exp<='9')
            {    postexp[i++]=*exp;
                exp++;
            }
            postexp[i++]='#';                            
    }
}
    while(!StackEmpty(Optr))
    {
        Pop(Optr,e);
        postexp[i++]=e;
    }
    postexp[i]='\0';
    DestroyStack(Optr);
}

double compvalue(char *postexp)
{
    double d,a,b,c,e;
    LinkStNode *Opnd;
    InitStack(Opnd);
    while(*postexp!='\0')
    {
        switch(*postexp)
        {
            case '+':
                Pop(Opnd,a);
                Pop(Opnd,b);
                c=b+a;
                Push(Opnd,c);
                break;
            case'-':
                Pop(Opnd,a);
                Pop(Opnd,b);
                c=b-a;
                Push(Opnd,c);
                break;
            case'*':
                Pop(Opnd,a);
                Pop(Opnd,b);
                c=b*a;
                Push(Opnd,c);
                break;
            case'/':
                Pop(Opnd,a);
                Pop(Opnd,b);
                if(a!=0)
                {
                    c=b/a;
                Push(Opnd,c);
                break;    
                }
                else
                {
                    printf("\n\t除零错误!\n");
                    exit(0);
                }
                break;
                default:
                d=0;
                while(*postexp>='0'&&*postexp<='9')
                {
                    d=10*d+*postexp-'0';
                    postexp++;
                }
                Push(Opnd,d);
                break;                    
        }
        postexp++;
    }
    GetTop(Opnd,e);
    DestroyStack(Opnd);
    return e;
}

bool  Match(char exp[],int n)
{
    int i=0;
ElemType e;
    bool match=true;
    LinkStNode *s;
    InitStack(s);
    while(i<n&&match)
    {
        if(exp[i]=='(')
        Push(s,exp[i]);
        else if(exp[i]==')')
        {
            if( GetTop(s,e)==true)
            {
                if(e!='(')
                match=false;
                else{
                 Pop(s,e);
        
                }
            }
            else match=false;
        }
        i++;
    }
    if(!StackEmpty(s))
    match=false;
    DestroyStack(s);
    return match;
  }  
   

int main()
{ ElemType e;
char exp[MaxSize];
while(Match!=false)
{
printf("请输入一个中缀表达式:\n") ;
scanf("%s",&exp);        
 if(Match(exp,10)==false)
 printf("括号不是配对的\n"); 
 else
 {
  printf("括号是配对的\n"); 
  char postexp[MaxSize];
  trans(exp,postexp);
  printf("中缀表达式:%s\n",exp);
  printf("后缀表达式:%s\n",postexp);
  printf("表达式的值为:%g\n",compvalue(postexp));
  return 1;
  }
}
}
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值