数据结构c语言表达式求值,数据结构C语言版_栈实现表达式求值

/*

数据结构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'+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值