中缀表达式转后缀表达式并计算结果(C语言版)#精选._第1页
中缀表达式转后缀表达式并计算结果(C语言版)#精选._第2页
中缀表达式转后缀表达式并计算结果(C语言版)#精选._第3页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论