下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、# include <stdio.h># include <malloc.h># include <conio.h> # define maxsize 100 typedef double datatype1; typedef char datatype2;typedef struct stack1datatype1 data1maxsize;int top1; /* 栈顶元素 */ seqstack1,*pseqstack1; /* 顺序栈 */ typedef struct stack2datatype2 data2maxsize;int top2; /
2、* 栈顶元素 */ seqstack2,*pseqstack2; /* 顺序栈 */ /* 栈的初始化 */pseqstack1 init_seqstack1(void)pseqstack1 S;S=(pseqstack1)malloc(sizeof(pseqstack1);if(S)S->top1=-1;return S;pseqstack2 init_seqstack2(void)pseqstack2 S;S=(pseqstack2)malloc(sizeof(pseqstack2);if(S)S->top2=-1;return S;/* 判断栈空 */int empty_se
3、qstack1(pseqstack1 S)if(S->top1=-1)return 1;elsereturn 0;int empty_seqstack2(pseqstack2 S)if(S->top2=-1)return 1;elsereturn 0;/*X 入栈 */int push_seqstack1(pseqstack1 S,datatype1 X) 栈满,无法入栈! n");if(S->top1=maxsize-1) printf(" return 0;+; else S->top1S->data1S->top1=X;return
4、 1;int push_seqstack2(pseqstack2 S,datatype2 X) 栈满,无法入栈! n");if(S->top2=maxsize-1) printf(" return 0; else S->top2+;S->data2S->top2=X;出栈 */return 1;/*Xint pop_seqstack1(pseqstack1 S,datatype1 *X)if(empty_seqstack1(S)return 0;else*X=S->data1S->top1;S->top1-; return 1;in
5、t pop_seqstack2(pseqstack2 S,datatype2 *X)if(empty_seqstack2(S)return 0;else*X=S->data2S->top2;0*/* 存放栈顶元素 */* 运算符 ch 前的操作数出栈存入/* 运算符 ch 后的操作数出栈存入/*c=a ch b*/* 存放读取到的表达式 (A) 的字符 */* 读表达式字符 =>A*/a*/b*/S=init_seqstack1(); /*while(ch!='#')/*初始化栈 */ 遇到元素 !='#' 时 */S->top2-; r
6、eturn 1;/* 求栈顶元素 */int gettop_seqstack1(pseqstack1 S,datatype1 *X) if(empty_seqstack1(S) return 0;else*X=S->data1S->top1; return 1;int gettop_seqstack2(pseqstack2 S,datatype2 *X) if(empty_seqstack2(S) return 0;else*X=S->data2S->top2; return 1;/* 判断字符是否为操作数。若是返回1,否则返回int isnum(char c)if(c
7、>='0' && c<='9')return 1;elsereturn 0;/* 求后缀表达式的值 */ double postfix_exp(char *A)pseqstack1 S; /* 定义栈 S*/ double operand=0;double result;double a;double b;double c;char ch;ch=*A+;判断 ch 是否为数字字符 , 计算出操作数 */if(isnum(ch)/*operand=operand*10+(ch-'0');else /* 否则 */if(o
8、perand)*/push_seqstack1(S,operand);/*当前字符不是数字 , 操作数结束 , 要入栈operand=0;if(ch!='' && ch!=' ')/* 运算符 ch 后的操作数出栈存入 b*/* 运算符 ch 前的操作数出栈存入 a*/ 将结果赋给 c */pop_seqstack1(S,&b);pop_seqstack1(S,&a);switch(ch) /* 求 a ch b=? , case '+' :c=a+b;break;case '-' :c=a-b;b
9、reak;case '*' :c=a*b;break;case '/' :if(b!=0) c=a/b;else!");printf(" 分母为零push_seqstack1(S,c);/* 将 c 压入栈中 */ ch=*A+;/* 遇到 '#'此时栈顶元素即为计算结果 result*/* 指针向下移动一位 */ 循环结束 */ gettop_seqstack1(S,&result);/* return result;/* 优先级判断函数 */ int priority(char op)switch(op)case
10、'#': return 1; case ')': return 2; case '+':case '-': return 3; case '*':case '/': return 4; case '(': return 5; default : return 0; /* 将指针 infixexp 指向的中缀表达式转换为指针 int infix_exp_value(char *infixexp,char *postfixexp) pseqstack2 S; /* 定义栈 S*/ int
11、 count=0;char w; /*存放读取到的表达式 (infixexp)char c; /*存放栈顶元素 */char topelement;/* 存出栈元素 */ S=init_seqstack2(); /* 初始化栈 */ if(!S) /* 栈的初始化判断 postfixexp的字符 */*/指向的后缀表达式 */!");printf(" 栈初始化失败 return 0; push_seqstack2(S,'#'); W=*infixexp; While(gettop_seqstack2(S,&c),c)!='#'|W!=
12、'#')/*<3> 等于'#' 时循环 */if(isnum(w)/*判断w是否为操作数,若是直接输出,读下一个字符=>w,转<3>*/* 将结束符 '# '/* 读表达式字符 =>W*/加入运算符栈S中*/栈顶元素不等于 '#' 或 w 不if(count)*postfixexp='' postfixexp+; count=0;*postfixexp=w;postfixexp+;w=*(+infixexp);else /*w 若是运算符分类如下 */为')' 则
13、 '('count=1;if( (gettop_seqstack2(S,&c),c)='(' && w=')' )/* 出栈不输出,读下一个字符=>W,转<3>*/如果栈顶为 '(' 并且 wpop_seqstack2(S,&topelement); /*w=*(+infixexp);else将 '(' 出栈存入 topelement*/if(gettop_seqstack2(S,&c),c)='('|priority(gettop_seqs
14、tack2(S,&c),c) ) < priority(w)转<3>*/)/*如果栈顶为'('或者栈顶优先级小于 W优先级,则W入栈,读下一个字符=>w,push_seqstack2(S,W);W=*(+infixexp);else/* 否则*/* 从运算符栈中出栈并输出 , 转<3>*/pop_seqstack2(S,&topelement);*postfixexp=topelement;*postfixexp='#'/*(+postfixexp)='0'/*postfixexp+;'#'*/在指针 postfixexp 指向的后缀表达式结尾追加字符在指针 postfixexp 指向的后缀表达式最后追加结束符'0'*/return 1;/* 主函数 */int main()int i=0;char Amaxsize;char Bmaxsize;printf(" 请输入表达式 ,如:20+13#, 必须以#号结尾 !n"); /* 1+2*(9+7)-4/2# 23+(12*3-2)/4+34*5/7)+108/9# */
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西省2024山西铁道职业技术学院招聘15人笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 国家事业单位招聘2024中央宣传部直属单位招聘106人笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 双柏县2024云南楚雄州双柏县文化和旅游局招聘县文化艺术团合同制演员(数名)笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 2026年中国华电集团甘肃分公司校园招聘(第一批)笔试历年难易错考点试卷带答案解析
- 2025广东广州花都城投源盛投资有限公司招聘项目用工人员及背景调查环节人员笔试历年难易错考点试卷带答案解析
- 2026年中国航油集团贵州石油有限公司招聘中专起报备考题库及答案详解(易错题)
- 昌吉州检察机关2026年面向社会公开招聘聘用制书记员备考题库及1套参考答案详解
- 山西省体育局直属事业单位2025年度公开招聘教练员备考题库有答案详解
- 百里杜鹃分局2025年面向社会公开招聘警务辅助人员备考题库及完整答案详解1套
- 西北师范大学《大学英语》2023-2024学年第一学期期末试卷
- 2025浙江宁波农商发展集团有限公司招聘3人考试参考题库及答案1套
- 2026商业地产马年新春年货节“金马迎春年货大集”活动策划方案【春节活动】
- 手术室院感课件
- 药剂科年度工作总结与未来规划报告
- 口腔护士种植课件
- 2025临沂市检察机关公开招聘聘用制书记员(47名)备考笔试试题及答案解析
- 企业个人信息保护合规检查清单
- 无痛人流术前术后护理要点
- 北京工商大学《无机与分析化学(1)》2024-2025学年第一学期期末试卷
- 2025架线工程安全考试题(含答案)
- 2021年10月23日全国事业单位联考A类《职业能力倾向测验》答案+解析
评论
0/150
提交评论