栈和应用_表达式求值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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");