版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中缀表达式转后缀表达式中缀表达式转后缀表达式的规则。1. 遇到操作数:直接输入到后缀表达式栈2. 遇到运算符,直接入操作符栈3. 遇到左括号:直接将其入栈4. 遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输 出。5. 遇到其他运算符:加减乘除:弹出所有优先级 大于或者等于 该运算符的栈顶元素,然后将 该运算符入栈6. 最终将操作符栈中的元素依次出栈,输出到后缀表达式栈。以下是自己写的代码。亲测没有问题。 (模拟一个计算器,可以带括号,中间可以空格,只支持整数输入,但是输出结果精确到小数后 6 位)#include "stdio.h"#defi
2、ne MAX_LEN 100 typedef struct calunsigned char isOper;/ 是否是操作数 1,操作符0.操作数double Num;/值。或者是操作符的ASCI值STRUCT_CAL;#define IS_NUM0x00#define IS_OPER0x01STRUCT_CAL stackCalMAX_LEN;STRUCT_CAL stackCalBackMAX_LEN; unsigned char topCal;char stackOperMAX_LEN;unsigned char topOper;/* 堆栈初始化*/ void stackInit(voi
3、d)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(topC
4、al>=MAX_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 >=
5、 sour1 直接入操作符栈*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;b
6、reak;case '*':case '/':if(sour1 = '*' |sour1 = '/'|sour1 = '+' |sour1 = '-'|sour1 = '(') return 1;else return 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(isla
8、stNum = 0) / 如果上一个字符是 操作符,那么接下来的数字是负数 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('*',s
9、tackOpertopOper-1) = 0) stackCalPush(stackOperPop(), 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('/')
10、; pStr+;islastNum = 0; break;case '(': stackOperPush('('); 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
11、39;4': case '5':case '6':case '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;is
12、lastNum = 1;break;case ' ':pStr+;break;default:pStr+;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",
13、(int)stackCali.Num);else if(stackCali.isOper = IS_OPER) printf("%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 = I
14、S_OPER)num1 = stackCalPop()->Num;num2 = stackCalPop()->Num; 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 : %fn", stackCal
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度跨境奶粉进口分销服务合同模板页24篇
- 建筑工程石灰使用安全保障合同20253篇
- 2025年度铝材原材料采购与供应链管理合同4篇
- 二零二五年度2025版木材加工废弃物回收利用合同3篇
- 零部件购销合同
- 2025版大白家电安全安装与环保责任合同范本3篇
- 2025年船舶货运安全与环保责任合同样本4篇
- 2025版小区物业电梯安全运行维护服务合同范本2篇
- 2025年度大学生创新创业项目投资合同8篇
- 二零二五年度全球海上货物运输合同电子数据交换协议3篇
- 2025年温州市城发集团招聘笔试参考题库含答案解析
- 2025版高考物理复习知识清单
- 除数是两位数的除法练习题(84道)
- 2025年度安全检查计划
- 2024年度工作总结与计划标准版本(2篇)
- 全球半导体测试探针行业市场研究报告2024
- (完整版)保证药品信息来源合法、真实、安全的管理措施、情况说明及相关证明
- 营销专员绩效考核指标
- 毕业论文-山东省农产品出口贸易的现状及对策研究
- 音乐思政课特色课程设计
- 2023年四川省乐山市中考数学试卷
评论
0/150
提交评论