版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 /ExpressionSeqStack.c#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#define ERR_NOMEMORY -1 /内存分配错误#define ERR_INVALIDPARAM -2 /输入参数无效#define ERR_OVERFLOW -3 /溢出#define ERR_ILLEGALINDEX -4 /非法的索引位置#define ERR_EMPTYRESULT -5 /无返回结果#define STACK_MAXSIZE
2、 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 ER
3、R_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(!sta
4、ck)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*s
5、tack,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)栈顶指针增1return 0;/*将元素出栈*/int Pop(SeqStack *stack,datatype *e)if(!stack)return ERR_INVALIDPARAM; /顺序栈无效if(stac
6、k->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='/')
7、priority1=2;if(op2='+'|op2='-')priority2=1; /运算符2的优先级else if(op2='*'|op2='/')priority2=2;return(priority1-priority2); /op1>op2,op1=op2,op1<op2/*中缀表达式转换为后缀表达式*/int InfixToSuffix(char *infix,char *suffix)char c;int t=0;char *pInfix=infix; /中缀表达式char *pSuffix=suffi
8、x; /后缀表达式/初始化顺序栈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); /直接将其添加到栈中e
9、lse if(c=')') /(4)当前字符为右括号")"Peek(&optr,&t); /取得括号内的运算符while(t!='(')*pSuffix=t; /将括号内的所有操作数和运 pSuffix+; /算符添加到后缀表达式中Pop(&optr,&t); /移除已添加的运算符Peek(&optr,&t); /查找下一个运算符Pop(&optr,&t); /将左括号移除else if(StackEmpty(&optr) /(5)运算符为空时直接将其入栈Push(&am
10、p;optr,&t);else /将栈中的所有运算符添加到后缀表达式中Peek(&optr,&t); /取栈顶运算符,当前运算符的优先级高于if(ComparePriority(c,t)>0) /栈顶运算符的优先级将直接入栈Push(&optr,&t);else /否则,将栈中所有优先级高于当前优先级 /的运算符添加到后缀表达式中while(!StackEmpty(&optr)&&ComparePriority(c,t)<=0)*pSuffix=t;pSuffix+;Pop(&optr,&t); /移除
11、已添加到后缀表达式中的运算符Peek(&optr,&t); /查找下一个运算符Push(&optr,c); /将当前运算符添加到栈中/扫描中缀表达式的下一个字符pSuffix+;/(6)将剩余的运算符添加到后缀表达式中while(!StackEmpty(&optr)Pop(&optr,&t);*pSuffix=t;pSuffix+;/释放顺序栈的内存free(optr.base);return0;/*计算两个操作数的值*/int Operate(int a,char op,int b)Switch(op)case'+':retur
12、na+b; /加法运算case'-':returna-b; /减法运算case'*':returna*b; /乘法运算case'/':returna/(b=0?1:b); /除法运算return 0;/*计算后缀表达式的值*/int CalculateExpressionBySuffix(char *suffix)char c;int a=0,b=0,s=0;const char *pSuffix=suffix; /后缀表达式/初始化程序栈SeqStack opnd;InitStack(&opnd);/从左到右依扫描后缀表达式while(
13、*pSuffix !='0') c=*pSuffix; /读取后缀表达式的每个字符if(c>='0'&&c<='9') /该字符为操作数Push(&opnd,c-48); /直接将其添加到栈中else /该字符为运算符Pop(&opnd,&b); /弹出两个操作数Pop(&opnd,&a);s=Operate(a,c,b); /将则两个操作数根据运算符进行计算Push(&opnd, s); /将计算结果重新压入栈中pSuffix+; /查找下一个操作数Pop(&opnd,&s); /弹出最终的计算结果free(opnd.base); /释放顺序表内存return s;/*程序主函数*/int main()char infix80=0;/保存中缀表达式char suffix80=0;/保存后缀表达式 int result=0; /表达式的计算结果 printf("请输入算术表达式:"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026陕西西安音乐学院招聘4人备考题库含答案详解
- 2026湖北武汉硚口区公立初中招聘初中教师7人备考题库附参考答案详解(满分必刷)
- 2026贵州事业单位联考思南县招聘75人备考题库附答案详解(模拟题)
- 2026江苏苏州工业园区翰林幼儿园教学辅助人员招聘1人备考题库附答案详解(研优卷)
- 2026福建三明市永安市城市建设投资集团有限公司招聘6人备考题库(含答案详解)
- 2026河北唐山古冶爱然医院招聘备考题库带答案详解(研优卷)
- 2026河北秦皇岛市妇幼保健院选聘3人备考题库附答案详解(a卷)
- 2026贵州铜仁市德江县考调城区小学紧缺学科专任教师26人备考题库及答案详解(各地真题)
- 2026江苏泰州市泰兴市自来水有限公司招聘10人备考题库含答案详解(轻巧夺冠)
- 2026浙江杭州市西湖区西庐幼儿园招聘幼儿教师1人备考题库(非事业)含答案详解(巩固)
- 水晶科普内容
- 2026年CAAC无人机练习测试卷带答案
- 2025年人才招聘市场智能招聘平台实施方案
- 2025上海智能机器人百大场景案例集
- 年产10万吨丁二烯氰化法制己二睛绿色生产工艺的设计
- 风信子教学课件
- 穿越机的基础知识
- 撤销限高和失信申请书
- 2025年羽毛球馆场地租赁
- 天津市历史高考考试范围知识点总结
- GRR测量系统分析报告范例
评论
0/150
提交评论