现在的位置: 首页 > 综合 > 正文

算术表达式求值

2013年07月22日 ⁄ 综合 ⁄ 共 2992字 ⁄ 字号 评论关闭

写了个算术表达式求值,有些缺陷,输入运算数时只能输入0~9。

 

#include <stdio.h>
#include 
<stdlib.h>
#define STACK_INIT_SIZE 
100
#define STACKINCREMENT 
10
#define OVERFLOW 
-2
#define INFEASIBLE 
-1
#define ERROR 
0
#define OK 
1
#define TRUE 
1
#define FALSE 
0
typedef struct    
//运算符栈
{
    
char *base;
    
char *top;
    
int stacksize;
}
SqStack;
typedef struct    
//运算数栈
{
    
int *base;
    
int *top;
    
int stacksize;
}
sqStack;

//一些栈的基本操作

int InitStack(SqStack* sq)
{
    sq
->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
    
if(!sq->base)exit(OVERFLOW);
    sq
->top=sq->base;
    sq
->stacksize=STACK_INIT_SIZE;
    
return OK;
}

int initStack(sqStack* sq)
{
    sq
->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
    
if(!sq->base)exit(OVERFLOW);
    sq
->top=sq->base;
    sq
->stacksize=STACK_INIT_SIZE;
    
return OK;
}


char GetTop(SqStack* sq,char* e)
{
    
if(sq->base==sq->top)return ERROR;
        
*e=*(sq->top-1);
        
return (*e);
}
 //GetTop

int getTop(sqStack* sq,int* e)
{
    
if(sq->base==sq->top)return ERROR;
        
*e=*(sq->top-1);
        
return (*e);
}
 //getTop

int Push(SqStack* sq,char e)
{
    
if(sq->top-sq->base>=sq->stacksize)
    
{
        sq
->base=(char*)realloc(sq->base,(sq->stacksize+STACKINCREMENT)*sizeof(char));
        
if(!sq->base)exit(OVERFLOW);
        sq
->top=sq->base+sq->stacksize;
        sq
->stacksize+=STACKINCREMENT;
    }

    
*sq->top++=e;
    
return OK;
}
//Push

int push(sqStack* sq,int e)
{
    
if(sq->top-sq->base>=sq->stacksize)
    
{
        sq
->base=(int*)realloc(sq->base,(sq->stacksize+STACKINCREMENT)*sizeof(int));
        
if(!sq->base)exit(OVERFLOW);
        sq
->top=sq->base+sq->stacksize;
        sq
->stacksize+=STACKINCREMENT;
    }

    
*sq->top++=e;
    
return OK;
}
//push


int Pop(SqStack* sq,char* e)
{
    
if(sq->base==sq->top)return ERROR;
      
*e=*--sq->top;
    
return OK;
}
//Pop

int pop(sqStack* sq,int* e)
{
    
if(sq->base==sq->top)return ERROR;
      
*e=*--sq->top;
    
return OK;
}
//pop


char Compare(char t1,char t2)  //判断两个运算符的优先关系
{
    
char  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(
"ERROR1 ");
                exit(ERROR);
              }

              
else
                f
='<';
              
break;
     
case ')':switch(t1)
              
{
            
case '(':f='=';
                
break;
            
case '#':printf("ERROR2 ");
                exit(ERROR);
            
default: f='>';
              }

            
break;
     
case '#':switch(t1)
          
{
        
case '#':f='=';
             
break;
        
case '(':printf("ERROR3 ");
             exit(ERROR);
        
default: f='>';
           }

   }
/*switch(t2)*/
   
return f;
}
/*Compare*/

int In(char c) //判断c是否为运算符
{
    
switch(c)
    
{
     
case'+':
     
case'-':
     
case'*':
     
case'/':
     
case'(':
     
case')':
     
case'#

抱歉!评论已关闭.