栈和应用_表达式求值

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#include

#include

#include

#include

#include

//函数结果状态代码

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define Stack_Init_Size 10

#define StackIncrement 2

//#define OVERFLOW -1 //在math.h 中已定义OVERFLOW 等于3

typedef int Status;

typedef int Boolean;

typedef int SElemType;

typedef struct sqstack//结构体

{

SElemType * base ;

SElemType * top ;

int stacksize ;//栈的大小

}SqStack,*PSqStack;

Status Init(SqStack &S)

{//初始化栈

S.base = (SElemType *)malloc(Stack_Init_Size * sizeof(SElemType));

if (!S.base) exit(OVERFLOW);//存分配不足

S.top = S.base;//栈为空

S.stacksize = Stack_Init_Size ;

return OK;

}

Status DestoryStack(SqStack &S)

{//销毁栈

free(S.base);

S.base = NULL;//预防野指针的出现

S.top = NULL;//预防野指针的出现

S.stacksize = 0;

return OK;

}

Status StackEmpty(SqStack S)

{//判断栈是否为空,若空返回TRUE 否则返回FALSE

if (S.base == S.top)

return TRUE ;

else

return FALSE ;

}

Status StackClear(SqStack &S)

{//清空栈

S.top = S.base;

return OK;

}

Status GetTop(SqStack S,SElemType &e)

{//若栈不为空,则e返回栈顶元素的值,返回值为OK,否则返回值为ERROR if (S.top == S.base) return ERROR;

e=*(S.top-1);

return OK;

}

Status Push(SqStack &S,SElemType e)

{//入栈操操作,入栈元素为e

if(S.top-S.base >= S.stacksize)//栈满了的时候

{

S.base = (SElemType *)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(SElemType));

if (!S.base) exit(OVERFLOW);

S.top = S.base + S.stacksize;

S.stacksize = S.stacksize+StackIncrement;

}

*(S.top) = e;//栈没满的时候

S.top++;

return OK;

}

Status Pop(SqStack &S,SElemType &e)

{//若栈不空,则删除栈顶元素,用e返回,返回值为OK,否则返回ERROR

if(S.top == S.base) return ERROR;

S.top--;//top里面没元素

e = *(S.top);

}

void StackTraverse(SqStack S)

{

SElemType * p=S.top-1;

// if(S.top == S.base) ;

while(p >= S.base)

{

printf("%d ",*p);

p--;

}

}

//以上是栈的基本操作

//下面的是对表达式的基本操作

char Precede(SElemType t1, SElemType t2)

{//判断t1,t2的优先级('#'代替'\n'),t1、t2是两个运算符char f;

switch(t2)

{

case'+':

case'-':if(t1 == '(' || t1 == '\n')

f ='<';//t1

else

f ='>';//t1>t2

break;

case'*':

case'/':if(t1 == '*' || t1 == '/' || t1 == ')')

f ='>';//t1>t2

else

f ='<';//t1

break;

case'(':if(t1 == ')')

{

printf("括号不匹配\n");

exit(ERROR);

}

else

f ='<';//t1

break;

case')':switch(t1)

{

case'(':f ='=';//t1=t2

break;

case'\n':printf("缺乏左括号\n");

相关文档
最新文档