版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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年中药检验工专项题库(附答案与解释)
- 合规与法律事务总监面试题题库解析(2026年)
- 2026年教师资格考试初级中学面试思想品德重点难点必刷题精析
- 天津农商银行招聘考试试卷及答案
- (正式版)DB3502∕T 056.1-2020 《政务信息共享协同平台 第1部分:总体设计》
- 体育活动流程方案
- 体育社会学教案
- 线上物流数据标注合作技术合同
- 宠物用品线上推广合作协议2026
- 2026辽宁沈阳盛京金控投资集团有限公司招聘4人参考题库带答案详解AB卷
- 2026年职业技能大赛CAD机械设计技能竞赛理论考试重点试题库
- 2026暑假离校前校长在全体教职工大会上讲话:圆满收官迎暑假凝心聚力再出发
- 2026年广东省惠州市惠城区中考模拟道德与法治试题(含答案)
- 昆明空港投资开发集团有限公司2026年招聘笔试题库
- 2026年江苏省南通市如皋市初中毕业、升学模拟考试试题英语 含答案
- 汉坦病毒临床分型与诊疗方案
- 中医诊所防火管理制度
- (完整版)一年级数独100题
- 武术馆聘用教练合同
- 信阳市国企招聘考试真题及答案
评论
0/150
提交评论