加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

表达式运算(栈)

发布时间:2020-12-14 22:55:12 所属栏目:大数据 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 #include stdio.h#include stdlib.h#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OVERFLOW 0typedef int SElemType; char m[20];typ

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW 0
typedef int SElemType; 
char m[20];
typedef enum aa{FALSE,TRUE} Status;
 
typedef struct{
 SElemType *base;
 SElemType *top;
 int stacksize;
}SqStack;
 
int N;
unsigned n;
 
Status InitStack(SqStack &S)
{
 S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
 if(!S.base)
  return FALSE;
 S.top=S.base;
 S.stacksize=STACK_INIT_SIZE;
 return TRUE;
}
 
Status Pop(SqStack &S,SElemType &e)
{
 if(S.top==S.base)
  return FALSE;
 e = *--S.top;
 return TRUE;
}
 
Status Push(SqStack &S,SElemType e)
{
 if(S.top-S.base >= S.stacksize)
 {
  S.base = (SElemType *)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType));
  if(!S.base)
   return FALSE;
  S.top = S.base + S.stacksize;
  S.stacksize += STACKINCREMENT;
 }
 *S.top++ = e;
 return TRUE;
}
 
Status GetTop(SqStack S,SElemType &e)
{
 if(S.top > S.base)
 {
  e = *(S.top-1);
  return TRUE;
 }
 else
  return FALSE;
}
 
Status StackEmpty(SqStack S)
{
 if(S.top == S.base)
  return TRUE;
 else
  return FALSE;
}
 
Status In(SElemType c) //判断c是否为运算符
{
 switch(c)
 {
  case'+':
  case'-':
  case'*':
  case'/':
  case'(':
  case')':
  case'#':
   return TRUE;
  default:
   return FALSE;
 }
}
 
char Precede(SElemType  t1,SElemType  t2) //判断两符号的优先关系
{
 SElemType f;
 switch(t2)
 {
  case'+':
  case'-':
   if(t1=='('||t1=='#')
   f='<';
  else
   f='>';
   break;
  case'*':
  case'/':
   if(t1=='*'||t1=='/'||t1==')')
   f='>';
  else
   f='<';
   break;
  case'(':
   if(t1==')')
   {   
    printf("括号不匹配n");
    exit(OVERFLOW);
   }
  else
   f='<';
   break;
  case')':
   switch(t1)
   {
    case'(':
     f='=';
     break;
    case'#':
     printf("缺乏左括号n");
     exit(OVERFLOW);
     default:
     f='>';
   }
  break;
  case'#':
   switch(t1)
   {
    case'#':
     f='=';
     break;
    case'(':
     printf("缺乏右括号n");
     exit(OVERFLOW);
     default:
     f='>';
   }
 }
 return f;
}
 
SElemType Operate(SElemType a,SElemType theta,SElemType b) //做四则运算a theta b,返回运算结果
{
 SElemType c;
  switch(theta)
  {
   case'+':
    return a+b;
   case'-':
    return a-b;
   case'*':
    return a*b;
  }
 return a/b;
}
 
SElemType EvaluateExpression()
{
 SqStack OPTR,OPND;
 SElemType a,b,c,x;
 int i=0;
 InitStack(OPTR);
 InitStack(OPND);
 Push(OPTR,'#');
 c=m[i++];
 GetTop(OPTR,x);
 while(c != '#' || x!='#')
 {
  if(In(c))
   switch(Precede(x,c))
   {
    case '<':
     Push(OPTR,c);
     c=m[i++];
     break;
    case '=':
     Pop(OPTR,x);
     c=m[i++];
     break;
    case '>':
     Pop(OPTR,x);
     Pop(OPND,b);
     Pop(OPND,a);
     Push(OPND,Operate(a,x,b));
     break;
   }
  else if(c>='0' && c<='9')
  {
   Push(OPND,c-48);
   c=m[i++];
  }
  else
  {
   printf("出现非法字符n");
   exit(OVERFLOW);
  }
  GetTop(OPTR,x);
 }
 Pop(OPND,x);
 if(!StackEmpty(OPND))
 {
  printf("表达式不正确n");
  exit(OVERFLOW);
 }
 return x;
}
 
void main()
{
   int x;
   
   while(1)
   {
 printf("1.输入表达式n2.输出表达式n3.判断表达式的括号是否匹配并计算表达式的值n4.退出n");
    printf("请选择1-4n");
  scanf("%d",&x);
   if(x==1)
   {
 printf("请输入算式表达式(输入的值要为0-9),中间运算值和输出结果为-128~127n");
        scanf("%s",m);
   }
    else if(x==2)
 { 
  printf("输出表达式n");
  printf("%sn",m);
 }
        else if(x==3)
  {
  printf("判断表达式的括号是否匹配并计算表达式的值n");
     printf("%dn",EvaluateExpression());
  }
  
             else if(x==4) 
    { 
     break;
    }
         else 
      { 
         printf("输入的为非法字符");
            break;
      }
}
}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读