首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

请问有关表达式求值的有关问题

2012-02-06 
请教有关表达式求值的问题我学习数据结构时,试着实现表达式求值,只要求能够简单计算10以下的数(包括算式结

请教有关表达式求值的问题
我学习数据结构时,试着实现表达式求值,只要求能够简单计算10以下的数(包括算式结果),包括几种基本四则运算和括号,且表达式开始和末尾以‘#’标识。但是总是有问题,想请教各位帮忙看一下源代码有什么问题,我不怎么会写程序,望各位批评指正!!谢谢

我是在vc编译器下运行的,但是重视出现三行“the   stack   is   empty!”

#include   <stdio.h>
#include   <stdlib.h>
#define   STACKSIZEINIT   100
char   Table[7][7]=
{
{ '> ', '> ', ' < ', ' < ', ' < ', '> ', '> '},
{ '> ', '> ', ' < ', ' < ', ' < ', '> ', '> '},
        { '> ', '> ', '> ', '> ', ' < ', '> ', '> '},
{ '> ', '> ', '> ', '> ', ' < ', '> ', '> '},
        { ' < ', ' < ', ' < ', ' < ', ' < ', '= ',0},
{ '> ', '> ', '> ', '> ',0, '> ', '> '},
        { ' < ', ' < ', ' < ', ' < ', ' < ',0, '= '},
};//运算符优先级表

struct   Stack
    {
          char   *base;
          char   *top;
          int   Stacksize;
      };
void   InitStack(Stack   &s)
{
        s.base=(char   *)malloc(STACKSIZEINIT   *   sizeof(char));
            if(!s.base)    
                {
                        printf( "Allocation   failed!\n ");
                          return;
                  }
        s.top=s.base;
        s.Stacksize=STACKSIZEINIT;
           
}
void   push(Stack   &s,char   c)
{
        if(s.top> =s.base+STACKSIZEINIT)
              printf( "over   flow\n ");
        else
{
*s.top=c;
      s.top++;
}
}
void   pop(Stack   &s,char   &c)
{
        if(s.top=s.base)
              printf( "the   stack   is   empty!\n ");
        else
              c=*(--s.top);
}
char   gettop(Stack   &s)
{
        return   *(s.top-1)     ;  
}

bool   IsNumber(char   c)
{
        if(c> = '0 '&&c <= '9 ')
              return   true;
        else  
                return   false;
}//判断字符是否是数字


char   Operate(char   a,char   theta,char   b)
{
          int   a1=a-48;
          int   b1=b-48;


          switch(theta)
          {
                case   '+ ':
                        return   48+(a1+b1);
                        break;
                case   '- ':
                        return   48+(a1-b1);
                        break;
                case   '* ':
                        return   48+a1*b1;
                        break;
                case   '/ ':
                        return   48+a1/b1;
                        break;  
default:
return   0;
          }      
}//返回运算操作结果

int   getorder(char   a)
{
          switch(a)
          {
                case   '+ ':
                      return   0;
                      break;
                case   '- ':
                      return   1;
                      break;
                case   '* ':
                      return   2;
                      break;
                case   '/ ':
                      return   3;
                      break;
                case   '( ':
                      return   4;
                      break;
                case   ') ':
                      return   5;
                      break;  
                case   '# ':
                      return   6;
                      break;
                 
          }
}   //根据运算符求的其在table表中的下标



char   Precede(char   a,char   b)
{
          return   Table[getorder(a)][getorder(b)];
       
}//返回优先级

char   calc()
{
        Stack   op,number;//op为操作符栈,number为操作数栈
        char   c=NULL;
        char   theta=NULL;
        char   a=NULL;
char   b=NULL;
char   x;
        InitStack(op);   push(op, '# ');
        InitStack(number);  
        printf( "Please   input   the   math   problem:\n ");
        c=getchar();
        while(c!= '# '||gettop(op)!= '# ')
            {
                      if(IsNumber(c))   {   push(number,c);c=getchar();}//若字符是数字这入数值number栈
                      else
                          switch(Precede(gettop(op),c))//否则如操作符栈
                            {
                                case   ' < '   :
                                          push(op,c);   c=getchar();
                                          break;
                                case   '= '   :
                                          pop(op,x);   c=getchar();
                                          break;
                                case   '> '   :
                                          pop(op,theta);
                                          pop(number,b);pop(number,a);
                                          push(number,Operate(a,theta,b));
                                          break;
                            }
            }
            int   result=gettop(number)-48;  
    delete   op.base;
    delete   number.base;
    return   result;


       
}

void   main()
{
            printf( "the   result   is   %d\n ",calc());
              return;
     
            //getch();
}

[解决办法]
s.base=(char *)malloc(STACKSIZEINIT * sizeof(char));


delete op.base;
delete number.base;
/////////////////////
你这在干啥呀

[解决办法]
malloc 对应 free
new 对应 delete

不要搞混了

热点排行