表达式运算(栈)

表达式运算(栈),第1张

概述表达式运算(栈)

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

#include <stdio.h>#include <stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OVERFLOW 0typedef 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-4\n");  scanf("%d",&x);   if(x==1)   { printf("请输入算式表达式(输入的值要为0-9),中间运算值和输出结果为-128~127\n");        scanf("%s",m);   }    else if(x==2) {   printf("输出表达式\n");  printf("%s\n",m); }        else if(x==3)  {  printf("判断表达式的括号是否匹配并计算表达式的值\n");     printf("%d\n",EvaluateExpression());  }               else if(x==4)     {      break;    }         else       {          printf("输入的为非法字符");            break;      }}}

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的表达式运算(栈)全部内容,希望文章能够帮你解决表达式运算(栈)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1277907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存