实现简单的表达式求值

#include<stdio.h>
#include<iostream.h>
#include<malloc.h>
//建立两个工作站一个存放操作符,是字符型的,一个存放操作数是整型的
#define STACKSIZE 100
#define STACKMORE 10
typedef struct stack{//操作符栈的结构
 char *base;
 char *top;
 int stacksize;
}stack;
typedef struct intstack{//操作数栈的结构
 int *base;
 int *top;
 int stacksize;
}intstack;
void initstack(stack &s)//两个建立函数
{
 s.base=(char*)malloc(STACKSIZE*sizeof(char));
 if(!s.base)  cout<<"error"<<endl;
 s.top=s.base;
 s.stacksize=STACKSIZE;
}
void intinitstack(intstack &s)
{
 s.base=(int*)malloc(STACKSIZE*sizeof(int));
 if(!s.base)  cout<<"error"<<endl;
 s.top=s.base;
 s.stacksize=STACKSIZE;
}
void push(stack &s,char e)//两个压栈的函数
{
 if(s.top -s.base>=s.stacksize)
 {
  s.base=(char*)realloc(s.base,(s.stacksize+STACKMORE)*sizeof(char));
  if(!s.base) cout<<"error"<<endl;
   s.top=s.stacksize+s.base;
      s.stacksize+=STACKMORE;
 }
 *s.top++ =e;
}
void intpush(intstack &s,int e)
{
 if(s.top -s.base>=s.stacksize)
 {
  s.base=(int*)realloc(s.base,(s.stacksize+STACKMORE)*sizeof(int));
  if(!s.base) cout<<"error"<<endl;
   s.top=s.stacksize+s.base;
      s.stacksize+=STACKMORE;
 }
 *s.top++ =e;
}
char gettop(stack s)//两个取值函数
{
 char e;
 if(s.base ==s.top )cout<<"error";
 e=*(s.top -1);
 return e;
}
int intgettop(intstack s)
{
 int e;
 if(s.base ==s.top )cout<<"error";
 e=*(s.top -1);
 return e;
}
void pop(stack &s,char &e)//两个删除并返回其值的函数
{
  if(s.base ==s.top )cout<<"error";
  e=*(--s.top);
}
void intpop(intstack &s,int &e)
{
  if(s.base ==s.top )cout<<"error";
  e=*(--s.top);
}
     char op[7][7]={'>', '>', '<', '<', '<', '>', '>', //定义操作符的优先性
               '>', '>', '<', '<', '<', '>', '>',
               '>', '>', '>', '>', '<', '>', '>',
               '>', '>', '>', '>', '<', '>', '>',
               '<', '<', '<', '<', '<', '=', 'E',
               '>', '>', '>', '>', 'E', '>', '>',
               '<', '<', '<', '<', '<', 'E', '='};
  int getsign(char optr)
  {
   int sign;
   switch(optr)
   {
        case '+': sign = 0; break;
        case '-': sign = 1; break;
        case '*': sign = 2; break;
        case '/': sign = 3; break;
        case '(': sign = 4; break;
        case ')': sign = 5; break;
        case '#': sign = 6; break;
   }
    return (sign);
  }
  char precede(char optr1,char optr2)
  {
   int sign1=getsign(optr1);
   int sign2=getsign(optr2);
   return(op[sign1][sign2]);
  }
  int operate(int a,char theta ,int b)//定义四则混合运算
  {
   int result=0;
   switch(theta)
    {
              case '+': result = a+b; break;
              case '-': result = a-b; break;
              case '*': result = a*b; break;
              case '/': result = a/b; break;
   }
         return result;
  }
  int read()//定义输出函数
  {
   int a,b,c;
   char theta,x;
   stack OPTR;
   intstack OPND;
   initstack(OPTR);
   push(OPTR,'#');
  intinitstack(OPND);
   c=getchar();
   int  sum=0;
   while(c!='#'|| gettop(OPTR)!='#') 
   {
          if ((c>='0') && (c<='9'))
    {
    sum=sum*10+(c-'0');
             c=getchar();
    if(!((c>='0') && (c<='9')))
    {
     intpush(OPND,sum);
     sum=0;
    }
    }
           else
     {
            switch (precede(gettop(OPTR),c))
   {
             case '<':push(OPTR,c);
              c=getchar();
                   break;
              case '=':pop(OPTR,x);
              c=getchar();
                break;
              case '>':pop(OPTR,theta);
             intpop(OPND,b);
             intpop(OPND,a);
             intpush(OPND,operate(a,theta,b));
              break;
            }
     }
   }
           return intgettop(OPND); 
  }

 void main()//函数入口
 {
  int result=0;
  cout<<"please put an experssion"<<endl;
  result=read();
  cout<<"the result is:"<<result<<endl;
  return ;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值