栈---实现表达式计算(完整)

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

//ExpressionSeqStack.c

#include

#include

#include

#include

#define ERR_NOMEMORY -1 //内存分配错误

#define ERR_INVALIDPARAM -2 //输入参数无效

#define ERR_OVERFLOW -3 //溢出

#define ERR_ILLEGALINDEX -4 //非法的索引位置

#define ERR_EMPTYRESULT -5 //无返回结果

#define STACK_MAXSIZE 100 //顺序栈存放的最大元素个数

typedef int datatype; //顺序栈元素的类型typedef struct{ //顺序栈结构类型datatype* base;

datatype* top;

int size;

}SeqStack;

/*初始化顺序栈*/

int InitStack(SeqStack *stack)

{

if(!stack)return ERR_INVALIDPARAM; //顺序栈无效

//分配内存空间

stack->base=(datatype*)malloc(STACK_MAXSIZE*sizeof(datatype));

if(!stack->base)return ERR_NOMEMORY; //内存分配失败

stack->top=stack->base; //初始栈顶位置

stack->size=STACK_MAXSIZE; //顺序栈的大小为STACK_MAXSIZE return 0;

}

/*栈是否为空*/

int StackEmpty(SeqStack *stack)

{

if(!stack)return ERR_INVALIDPARAM; //顺序栈无效

return(stack->top==stack->base); //True为空;False为非空

}

/*清空栈*/

int ClearStack(SeqStack *stack)

{

if(!stack)return ERR_INVALIDPARAM; //顺序栈无效

stack->top=stack->base; //重置栈顶位置

return 0;

}

/*取得栈顶元素*/

int GetTop(SeqStack *stack,datatype *e)

{

if(!stack)return ERR_INVALIDPARAM; //顺序栈无效

if(stack->top==stack->base)return ERR_EMPTYRESULT;//栈为空

*e=*(stack->top-1); //返回栈顶元素 return 0;

}

/*将元素入栈*/

int Push(SeqStack*stack,datatype e)

{

if(!stack)return ERR_INVALIDPARAM; //顺序栈无效

if(stack->top>stack->base+stack->size-1)

return ERR_OVERFLOW; //(1)栈满

*(stack->top)=e; //(2)将元素e赋予新的栈顶位置stack->top++; //(3)栈顶指针增1

return 0;

}

/*将元素出栈*/

int Pop(SeqStack *stack,datatype *e)

{

if(!stack)return ERR_INVALIDPARAM; //顺序栈无效

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

return ERR_EMPTYRESULT; //(1)栈为空

stack->top--; //(2)栈顶指针减1

*e=*(stack->top); //(3)返回栈顶元素

return 0;

}

/*比较两运算符的优先关系*/

int ComparePriority(char op1,char op2)

{

int priority1=0,priority2=0;

if(op1=='+'||op1=='-')priority1=1; //运算符1的优先级

else if(op1=='*'||op1=='/')priority1=2;

if(op2=='+'||op2=='-')priority2=1; //运算符2的优先级

else if(op2=='*'||op2=='/')priority2=2;

return(priority1-priority2); //op1>op2,op1=op2,op1

/*中缀表达式转换为后缀表达式*/

int InfixToSuffix(char *infix,char *suffix)

{

char c;int t=0;

char *pInfix=infix; //中缀表达式

char *pSuffix=suffix; //后缀表达式

//初始化顺序栈

SeqStack optr;

InitStack(&optr);

//依次扫描中缀表达式

while(*pInfix!='\0')

{

c=*pInfix; //(1)读取中缀表达式的每个字符

if(c>='0'&&c<='9') //(2)该字符为操作数

{

*pSuffix=c; //直接添加到后缀表达式中

pSuffix++; //指向保存下一个字符的位置

}

else if(c=='(') //(3)当前字符为左括号"("

{

Push(&optr,c); //直接将其添加到栈中

}

else if(c==')') //(4)当前字符为右括号")"

{

Peek(&optr,&t); //取得括号内的运算符

while(t!='(')

{

*pSuffix=t; //将括号内的所有操作数和运

pSuffix++; //算符添加到后缀表达式中

Pop(&optr,&t); //移除已添加的运算符

Peek(&optr,&t); //查找下一个运算符

}

Pop(&optr,&t); //将左括号移除

}

相关文档
最新文档