/*
数据结构C语言版 栈实现表达式求值
P52-54
编译环境:Dev-C++ 4.9.9.2
日期: 2011年2月10日
*/
typedef int SElemType;// 栈的元素类型
#define STACK_INIT_SIZE 10// 存储空间初始分配量
#define STACKINCREMENT 2// 存储空间分配增量
// 栈的顺序存储表示 P46
typedef struct SqStack
{
SElemType *base;// 在栈构造之前和销毁之后,base的值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}SqStack;// 顺序栈
//构造一个空栈S。
int InitStack(SqStack *S)
{
// 为栈底分配一个指定大小的存储空间
(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if( !(*S).base )
exit(0); // 存储分配失败
(*S).top = (*S).base;// 栈底与栈顶相同表示一个空栈
(*S).stacksize = STACK_INIT_SIZE;
return 1;
}
//若栈不空,则用e返回S的栈顶元素,并返回1;否则返回0。
int GetTop(SqStack S,SElemType *e)
{
if(S.top > S.base)
{
*e = *(S.top-1);// 栈顶指针的下一个位置为栈顶元素
return 1;
}
else
return 0;
}
//插入元素e为新的栈顶元素。
int Push(SqStack *S, SElemType e)
{
if((*S).top - (*S).base >= (*S).stacksize)// 栈满,追加存储空间
{
(*S).base = (SElemType *)realloc((*S).base,
((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));
if( !(*S).base )
exit(0); // 存储分配失败
(*S).top = (*S).base+(*S).stacksize;
(*S).stacksize += STACKINCREMENT;
}
*((*S).top)++=e;
// 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左
return 1;
}
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回0。
int Pop(SqStack *S,SElemType *e)
{
if((*S).top == (*S).base)
return 0;
*e = *--(*S).top;
// 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左
return 1;
}
// 根据教科书表3.1,判断两符号的优先关系
SElemType Precede(SElemType t1,SElemType t2)
{
SElemType 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\n");
exit(0);
}
else
f='
break;
case ')':
switch(t1)
{
case '(':
f='=';
break;
case '#':
printf("ERROR2\n");
exit(0);
default:
f='>';
}
break;
case '#':
switch(t1)
{
case '#':
f='=';
break;
case '(':
printf("ERROR3\n");
exit(0);
default:
f='>';
}
}
return f;
}
// 判断c是否为运算符
int In(SElemType c)
{
switch(c)
{
case'+