后缀表达式的运算求值


/*
1.首先先将中缀表达式转换为后缀表达式
2.然后我们要分情况;
如果为数字字符串就直接入栈;
如果是左括号入栈就直接入栈
如果是右括号则将栈中左括号之前的所有字符出栈;
如果是数字字符串则需要考虑运算符的优先级
最后将栈最后一个赋为0,字符串结束
*/
/************************************/
	
#include<stdio.h>
#include<stdlib.h>
#define newp (stype *)malloc(sizeof(stype))  //定义一个申请栈地址的宏
typedef struct _stack{
 char dat;
    struct _stack *next;
} stype;  //建立栈类型
int tance(char x)  //探测优先级 
{
 if(x=='+'||x=='-') return 0;
 else if (x=='*'||x=='/') return 1;
 else if (x=='@'||x=='('||x==')')  return -1;
}
int main()
{
 stype *s,*top;  //栈指针和栈顶指针 
 char c;
 s=newp;
 s->dat='@';
 s->next=NULL;
 top=s;
 printf("please input :  ") ;
 c=getchar();  //此后为读取中缀表达式的部分,用字符一个一个的读,直到读到回车 
 	printf("It's output : ");
 while(c!='\n')
 {
  if (c>='0'&&c<='9')  //如果读入数字,直接打印 
  {
  
   printf("%c ",c);
  }
  else if (c=='(')  //如果是左括号,直接进栈 
  {
   s=newp;
   s->dat=c;
   s->next=top;
   top=s;
  }
  else if (c==')')  //如果是右括号,匹配左括号,把两者之间的栈内符号全部弹出 
  {
   while (top->dat!='(')
   {
    s=top;
    printf("%c ",top->dat);
    top=top->next;
    free(s);
   }
   s=top;
   top=top->next;
   free(s);
  }
  else  //否则肯定是+-*/了 
  {
   int a=tance(c);
   int b=tance(top->dat);  //比较该符号和栈顶符号的优先级 
   if (a>b)  //如果大于直接压进去 
   {
    s=newp;
    s->dat=c;
    s->next=top;
    top=s;
   }
   else  //否则就把栈顶的符号一直弹出,直到弹到可以压进去,然后压进去(也就是说等于也不能压进去) 
   {
    while (a<=b)
    {
     s=top;
        printf("%c ",top->dat);
        top=top->next;
        free(s);
        b=tance(top->dat);
    }
    s=newp;
    s->dat=c;
    s->next=top;
    top=s;
   }
  }
  c=getchar();  //读取下一个字符 
 }
 while (top->dat!='@')  //读完和还不算完,还要把栈内剩余的所有符号挨个弹出 
 {
  s=top;
  printf("%c ",top->dat);
  top=top->next;
  free(s);
 }
 return 0;  //后缀表达式输出完毕 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值