版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上中缀表达式转后缀表达式中缀表达式转后缀表达式的规则。1.遇到操作数:直接输入到后缀表达式栈2.遇到运算符,直接入操作符栈3.遇到左括号:直接将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈6.最终将操作符栈中的元素依次出栈,输出到后缀表达式栈。以下是自己写的代码。亲测没有问题。(模拟一个计算器,可以带括号,中间可以空格,只支持整数输入,但是输出结果精确到小数后6位)#include "stdio.h"#defi
2、ne MAX_LEN 100typedef struct calunsigned char isOper;/是否是操作数 1,操作符 0.操作数double Num;/值。或者是操作符的ASCII值STRUCT_CAL;#define IS_NUM 0x00#define IS_OPER0x01STRUCT_CAL stackCalMAX_LEN;STRUCT_CAL stackCalBackMAX_LEN;unsigned char topCal;char stackOperMAX_LEN;unsigned char topOper;/* 堆栈初始化*/void stackInit(void
3、)int i;for(i=0;i<MAX_LEN;i+)stackCali.isOper = 0;stackCali.Num = 0;stackOperi = 0;topCal = topOper = 0;/* 返回堆栈的栈顶,返回后栈顶减一*/STRUCT_CAL * stackCalPop(void)if(topCal = 0)return (STRUCT_CAL *)0;return stackCal+(-topCal);/* 计算表达式入栈*/void stackCalPush(double num, unsigned char isOper)if(topCal>=MAX_
4、LEN)return;stackCaltopCal.Num = num;stackCaltopCal.isOper= isOper;topCal+;/* 操作符出栈*/char stackOperPop(void)if(topOper = 0)return 0;return stackOper-topOper;/* 操作符入栈*/void stackOperPush(char oper)if(topOper >=MAX_LEN)return;stackOpertopOper+ = oper;/*比较两个 sour sour1 的优先级*1 sour >= sour1 直接入操作符栈
5、*0 sour < sour1 直接入计算表达式栈*/unsigned char comparPrior(char sour, char sour1)if(sour ='0' |sour1 = '0') return 1;switch(sour)case '+':case '-':if(sour1 = '*' |sour1 = '/'|sour1 = '+' |sour1 = '-' )return 0;elsereturn 1;break;case '
6、*':case '/':if(sour1 = '*' |sour1 = '/'|sour1 = '+' |sour1 = '-'|sour1 = '(')return 1;elsereturn 0;break;default:return 1;break;/* 将输入的字符串转换为栈*/void StrToCal(char *pStr)int tmpNum = 0;char tmpOper;char islastNum = 0;/判断上一个字符是什么。如果是符号,现在碰到-,那么数字就是负数
7、char isNumNegative = 0;while(*pStr != '0')switch(*pStr)case '+':while(comparPrior('+',stackOpertopOper-1) = 0)stackCalPush(stackOperPop(), IS_OPER);if(topOper<1)break;stackOperPush('+');pStr+;islastNum = 0;break;case '-':if(islastNum = 0) /如果上一个字符是 操作符,那么接下
8、来的数字是负数isNumNegative = 1;/ 1代表 是负数pStr+;break;while(comparPrior('-',stackOpertopOper-1) = 0)stackCalPush(stackOperPop(), IS_OPER);if(topOper<1)break;stackOperPush('-');pStr+;islastNum = 0;break;case '*':while(comparPrior('*',stackOpertopOper-1) = 0)stackCalPush(sta
9、ckOperPop(), IS_OPER);if(topOper<1)break;stackOperPush('*');pStr+;islastNum = 0;break;case '/':while(comparPrior('/',stackOpertopOper-1) = 0)stackCalPush(stackOperPop(), IS_OPER);if(topOper<1)break;stackOperPush('/');pStr+;islastNum = 0;break;case '(':st
10、ackOperPush('(');pStr+;islastNum = 0;break;case ')':while(tmpOper = stackOperPop() != '(')stackCalPush(tmpOper, IS_OPER);pStr+;islastNum = 0;break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '
11、7':case '8':case '9':while(*pStr >='0' )&& (*pStr <='9')tmpNum = tmpNum *10 +*(pStr+) - '0'if(isNumNegative)isNumNegative = 0;tmpNum = -tmpNum;stackCalPush(tmpNum, IS_NUM);tmpNum = 0;islastNum = 1;break;case ' ':pStr+;break;default:pS
12、tr+;break;while(topOper) /如果最后操作符栈还有数据,直接入计算栈stackCalPush(stackOperPop(), IS_OPER);/* 显示转换后的后缀表达式,用于调试,看转换是否正确*/void dispCalc(void)int i = 0;printf("n");for(i = 0;i<topCal;i+)if(stackCali.isOper = IS_NUM)printf("%d",(int)stackCali.Num);else if(stackCali.isOper = IS_OPER)printf
13、("%c",(char)stackCali.Num);/* 计算后缀表达式的计算结果*/void suffixExpression(void)int i = 0;int tmpTop;double num1,num2;for(i = 0;i<topCal;i+)stackCalBacki = stackCali;i = 0;tmpTop = topCal;topCal = 0;while(1)if(stackCalBacki.isOper = IS_OPER)num1 = stackCalPop()->Num;num2 = stackCalPop()->N
14、um;switch(char)stackCalBacki.Num)case '+':stackCalPush(num2+num1, IS_NUM);break;case '-':stackCalPush(num2-num1, IS_NUM);break;case '*':stackCalPush(num2*num1, IS_NUM);break;case '/':stackCalPush(int)num2/num1, IS_NUM);break;default :break;elsestackCalPush(stackCalBacki.Num, IS_NUM);i+;if(i>=tmpTop) break;printf("nThe result is :
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026北师大版小学四年级下册语文期末模拟试卷 两套含答案解析
- 养老机构老年人能力综合评估办法(2026年)
- 漂流景区运营服务安全隐患排查治理自查报告
- 美妆护肤产品成分过敏问题情况说明
- 旅游景区环境卫生管理制度
- 导游专业业务实习报告
- 公司会计统计员工作总结
- 人际交往的艺术图文
- 中国老年2型糖尿病防治临床指南总结2026
- 蔬果新规落地实施指南
- 2026长江财产保险股份有限公司武汉分公司综合部(副)经理招聘1人笔试备考题库及答案解析
- 2026年4月自考10993工程数学(线性代数、概率论与数理统计)试题
- GB/Z 177.2-2026人工智能终端智能化分级第2部分:总体要求
- 2026年广东东莞市初二学业水平地理生物会考试题题库(答案+解析)
- 中远海运集团2026招聘笔试
- 新生儿呼吸窘迫综合征应急预案演练脚本
- 2026中级消防设施操作员《基础知识》记忆口诀
- 物流配送司机奖惩制度
- 二次供水设施维护与安全运行管理制度培训
- 反兴奋剂知识试题及答案
- 2025年日照教师编会计岗笔试及答案
评论
0/150
提交评论