写了个算术表达式求值,有些缺陷,输入运算数时只能输入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'#
#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'#