中缀表达式转后缀表达式并计算结果(C语言版)
更新时间:2023-10-23 04:17:01 阅读量: 综合文库 文档下载
中缀表达式转后缀表达式
中缀表达式转后缀表达式的规则。
1.遇到操作数:直接输入到后缀表达式栈 2.遇到运算符,直接入操作符栈 3.遇到左括号:直接将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将操作符栈中的元素依次出栈,输出到后缀表达式栈。
以下是自己写的代码。亲测没有问题。(模拟一个计算器,可以带括号,中间可以空格,只支持整数输入,但是输出结果精确到小数后6位)
#include \
#define MAX_LEN 100 typedef struct cal{
unsigned char isOper;//是否是操作数 1,操作符 0.操作数 double Num; //值。或者是操作符的ASCII值 }STRUCT_CAL;
#define IS_NUM 0x00 #define IS_OPER 0x01
STRUCT_CAL stackCal[MAX_LEN]; STRUCT_CAL stackCalBack[MAX_LEN]; unsigned char topCal;
char stackOper[MAX_LEN];
unsigned char topOper;
/***************************************************************** * 堆栈初始化
*****************************************************************/ void stackInit(void)
{ int i; for(i=0;i /***************************************************************** * 返回堆栈的栈顶,返回后栈顶减一 *****************************************************************/ STRUCT_CAL * stackCalPop(void) { if(topCal == 0)return (STRUCT_CAL *)0; return stackCal+(--topCal); } /***************************************************************** * 计算表达式入栈 *****************************************************************/ void stackCalPush(double num, unsigned char isOper) { if(topCal>=MAX_LEN)return; stackCal[topCal].Num = num; stackCal[topCal].isOper= isOper; topCal++; } /***************************************************************** * 操作符出栈 *****************************************************************/ char stackOperPop(void) { if(topOper == 0)return 0; return stackOper[--topOper]; } /***************************************************************** * 操作符入栈 *****************************************************************/ void stackOperPush(char oper) { if(topOper >=MAX_LEN)return; stackOper[topOper++] = oper; } /***************************************************************** * 比较两个 sour sour1 的优先级 * 1 sour >= 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; } else { return 1; } break; 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;//判断上一个字符是什么。如果是符号,现在碰到‘-’,那么数字就是负数 char isNumNegative = 0; while(*pStr != '\\0') { switch(*pStr) { case '+': while(comparPrior('+',stackOper[topOper-1]) == 0) { stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break; } stackOperPush('+'); pStr++; islastNum = 0; break; case '-': if(islastNum == 0) //如果上一个字符是 操作符,那么接下来的数字是负数 { isNumNegative = 1;// 1代表 是负数 pStr++; break; } while(comparPrior('-',stackOper[topOper-1]) == 0) { stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break; } stackOperPush('-'); pStr++; islastNum = 0; break; case '*': while(comparPrior('*',stackOper[topOper-1]) == 0) { stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break; } stackOperPush('*'); pStr++; islastNum = 0; break; case '/': while(comparPrior('/',stackOper[topOper-1]) == 0) { stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break; } stackOperPush('/'); pStr++; islastNum = 0; break; case '(': stackOperPush('('); pStr++; islastNum = 0; break; case ')': while((tmpOper = stackOperPop()) != '(') { stackCalPush(tmpOper, IS_OPER); } pStr++;
正在阅读:
2022届天津市河东区高三第一次模拟考试数学(文)试题(Word版无答04-24
威尼斯的小艇第一课时教学设计04-19
出国留学语言考试种类介绍12-04
小学生三年级有关春节的作文:年味06-12
毕业设计论12-06
副县长述职述廉报告典型(精选多篇)09-26
微机原理课程设计报告(电子秒表)11-16
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 表达式
- 中缀
- 后缀
- 语言
- 结果
- 计算
- 审计学原理2015南审范围版介绍
- 浙江省名校协作体2018学年第一学期联考试题卷高三数学
- 辅导员工作手册 - 图文
- 教育学概论模拟试卷(不含答案)
- 部编本人教版二年级语文下册语文园地三教案
- 《中国人群骨质疏松症防治手册2010版》 - 图文
- 中国药膳市场发展现状及未来五年投资定位分析报告
- 氨冷冻机系统操作规程 - 图文
- 2018届全国高考考前猜题卷(二)理综化学试卷
- 上财投资学教程第二版课后练习及答案 第九章
- its a nice day, isnt it教案1
- 学校精细化管理实施细则
- CAD高级证考试样卷02
- 道路工程材料试题5
- 工业企业能源统计报表制度汇编(doc 47页)(正式版) - 图文
- 成长篇
- 发酵工程与设备习题答案
- 校社联工作手册 - 图文
- 四年级英语下册Module5Unit1Iwastwothen教案1(三起)
- 中软国际校园招聘笔试试题 - IIA