[数据结构]第二次作业:表达式的计算

来源:互联网 发布:什么软件写日记最好 编辑:程序博客网 时间:2024/04/29 14:20

/* 头文件 */
  #define OK             1
  #define ERROR          0
  #define OVERFLOW       -2
  #define TRUE            1
  #define FALSE           0
  #define STACK_INIT_SIZE 100
  #define STACKINCREMENT  10

  typedef char ElemType;
  typedef int Status;
  typedef char SElemType;

  typedef struct
         {
      SElemType *base;
      SElemType *top;
      int stacksize;
         }SqStack;

  SqStack OPTR;
  SqStack OPND;

  int a,b,result;
  char x,theta,c;

/*源文件*/

/* ==============  Program Description  ============= */
/*             Freshare's 2nd_1 of dswork             */
/* ================================================== */

#include "stdio.h"                 
#include "2nd.h"

int In(char c)  // 判断是否为运算符
{
if ( c=='(' || c=='+' || c=='-' || c == '*' || c=='/' || c==')' || c=='#')
return TRUE;
else return FALSE ;
}

int Operate ( char d ,char e,char f) //计算
{
int uu;
switch(e)
{
case '+':
       uu=d+f;
        break;
case '-':
       uu=d-f;
        break;
case '*':
       uu=d*f;
        break;
case '/':
       uu=d/f;
        break;
    }
return uu;
}

char Precede(char a,char b) //判断优先级
{
    char op;
switch(a)
{
case '#':
    if (b=='#') op='=';else op='<';
        break;
case '+':
if (b=='+'||b=='-'||b==')'||b=='#') op='>';else op='<';
        break;
case '-':
if (b=='*'||b=='/'||b=='(') op='<';else op='>';
        break;
case '*':
if (b=='(') op='<';else op='>';
        break;
case '/':
if (b=='(') op='<';else op='>';
        break;
case '(':
if (b==')') op='=';else op='<';
        break;
case ')':
op='>';
        break;
    }
return op;
}

SqStack InitStack( SqStack s) //初始化
{
  s.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  if(!s.base) exit (OVERFLOW);
  s.top=s.base;
  s.stacksize = STACK_INIT_SIZE ;
  return s;
}

SElemType GetTop ( SqStack S) //GetTop
{
SElemType e;
if ( S.top == S.base) return ERROR;
e = *( S.top -1 );
return e ;
}

SqStack Push ( SqStack S , SElemType e) //Push
{
if ( S.top - S.base >= S.stacksize )
{
S.base = (ElemType *) realloc (S.base ,
                                  (S.stacksize +  STACKINCREMENT) * sizeof(ElemType));
     if(!S.base) exit (OVERFLOW);
     S.top = S.base +S.stacksize ;
     S.stacksize +=  STACKINCREMENT;
}
*S.top++ = e;
return S ;
}

int Pop_OPND () //Pop
{
if( OPND.top == OPND.base) return ERROR ;
return *--OPND.top ;
}

char Pop_OPTR () //Pop
{
if( OPTR.top == OPTR.base) return ERROR ;
return *--OPTR.top ;
}

SElemType EvaluateExpression() //EvaluateExpression
{
OPTR=InitStack (OPTR);
OPTR=Push(OPTR,'#');
OPND=InitStack (OPND);
c = getchar();
while (c!='#'||GetTop(OPTR)!='#')
{
if (!In(c))
   {
   c-=48;
   OPND=Push (OPND,c);
   c =getchar();
   }
else
switch (Precede (GetTop(OPTR),c))
{
case '<':
     OPTR=Push(OPTR,c); c=getchar();
break;
   case '=':
     x=Pop_OPTR(); c=getchar();
break;
case '>':
    theta=Pop_OPTR();
b=Pop_OPND();
a=Pop_OPND();
OPND=Push(OPND,Operate(a,theta,b));
break;
}
}
return (GetTop(OPND));
}

void main()
{
   printf("请输入一个表达式,并以#号结束:/n>>>>");
   result=EvaluateExpression();
   printf(">>>>结果是:%d/n",result);
   getchar();
}

原创粉丝点击