c语言precede函数怎么构造,数据结构——栈的应用(表达式求值)(C语言)

#include #define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define STACK_INIT_SIZE 100 //存储空间初始分配量

#define STACKINCREMENT 10 //存储空间分配增量

typedef char SElemType;

typedef char OperandType; //表达式求值的运算类型

typedef int Status;

typedef struct

{

SElemType *base;

SElemType *top;

int stacksize;

}SqStack;

//构造一个空栈

Status InitStack(SqStack *S)

{

S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));

if(!S->base)

{

printf("内存分配失败!\n");

exit(OVERFLOW);

}

S->top = S->base;

S->stacksize = STACKINCREMENT;

return OK;

}

//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

Status GetTop(SqStack *S, SElemType *e)

{

if(S->top == S->base)

return ERROR;

*e = *(S->top - 1);

return OK;

}

//插入元素e为新的栈顶元素

Status Push(SqStack *S, SElemType e)

{

if(S->top - S->base >= STACK_INIT_SIZE) //栈满, 追加存储空间

{

S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));

if(!S->base)

{

printf("内存分配失败!\n");

exit(OVERFLOW);

}

S->top = S->base + S->stacksize;

S->stacksize += STACKINCREMENT;

}

*S->top++ = e;

return OK;

}

//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回Ok;否则返回ERROR

Status Pop(SqStack *S, SElemType *e)

{

if(S->top == S->base)

return ERROR;

*e = *--S->top;

return OK;

}

//销毁栈S,使其不复存在

Status StackDestroy(SqStack *S)

{

free(S->base);

S->base = NULL;

S->top = NULL;

S->stacksize = 0;

return OK;

}

//清空栈S,保留栈底指针

void ClearStack(SqStack *S)

{

S->top = S->base;

}

//根据教科书表3.1,判断两符号的优先关系

char Precede(char t1, char t2){

int i,j;

char pre[][7]={

//运算符之间的优先级制作成一张表格

{'>','>','','>'},

{'>','>','','>'},

{'>','>','>','>','','>'},

{'>','>','>','>','','>'},

{'','>','>','>','0','>','>'},

{'':

Pop(&OPTR, &theta); //退栈并将运算结果压入OPND中

Pop(&OPND, &b);

Pop(&OPND, &a);

Push(&OPND, Operate(a, theta, b));

break;

}

}

else if(c >= '0' && c <= '9') //c是操作数

{

i = 0;

do

{

z[i] = c;

i ++;

c = getchar();

}while(c >= '0' && c <= '9');

z[i] = 0;

d = atoi(z); //将字符数组转为整型存于d

Push(&OPND, d);

}

else //c为非法字符

{

printf("ERROR3\n");

exit(1);

}

GetTop(&OPTR, &x);

}

GetTop(&OPND, &x);

StackDestroy(&OPTR);

StackDestroy(&OPND);

return x;

}

int main()

{

printf("请输入算术表达式,负数要用(0-正数:\n");

printf("%d\n", EvaluateExpression());

return 0;

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值