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