版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.# include <stdio.h># include <malloc.h># include <conio.h># define maxsize 100 typedef double datatype1;typedef chardatatype2;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_seqstack1(pse
3、qstack1 S)if(S->top1=-1)return 1;elsereturn 0;1 / 7.int empty_seqstack2(pseqstack2 S)if(S->top2=-1)return 1;elsereturn 0;/*X 入栈 */int push_seqstack1(pseqstack1 S,datatype1 X)if(S->top1=maxsize-1)printf(" 栈满,无法入栈!n");return 0;elseS->top1+;S->data1S->top1=X;return 1;int pus
4、h_seqstack2(pseqstack2 S,datatype2 X)if(S->top2=maxsize-1)printf(" 栈满,无法入栈!n");return 0;elseS->top2+;S->data2S->top2=X;return 1;/*X 出栈 */int pop_seqstack1(pseqstack1 S,datatype1 *X)if(empty_seqstack1(S)return 0;2 / 7.else*X=S->data1S->top1;S->top1-;return 1;int pop_seq
5、stack2(pseqstack2 S,datatype2 *X)if(empty_seqstack2(S)return 0;else*X=S->data2S->top2;S->top2-;return 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_seqst
6、ack2(S)return 0;else*X=S->data2S->top2;return 1;/* 判断字符是否为操作数。若是返回1,否则返回0*/int isnum(char c)if(c>='0' && c<='9')return 1;elsereturn 0;3 / 7./* 求后缀表达式的值*/double postfix_exp(char *A)pseqstack1 S; /* 定义栈 S*/double operand=0;double result;/* 存放栈顶元素 */double a; /* 运算符
7、ch 前的操作数出栈存入a*/double b; /* 运算符 ch 后的操作数出栈存入b*/double c; /*c=a ch b*/char ch;/* 存放读取到的表达式(A)的字符 */ch=*A+; /* 读表达式字符=>A*/S=init_seqstack1(); /* 初始化栈 */while(ch!='#')/* 遇到元素 !='#' 时 */if(isnum(ch)/* 判断 ch 是否为数字字符,计算出操作数*/operand=operand*10+(ch-'0');else /* 否则 */if(operand)pu
8、sh_seqstack1(S,operand);/* 当前字符不是数字 ,操作数结束 ,要入栈 */ operand=0;if(ch!='' && ch!=' ')pop_seqstack1(S,&b);/* 运算符 ch 后的操作数出栈存入b*/pop_seqstack1(S,&a);/* 运算符 ch 前的操作数出栈存入a*/switch(ch)/* 求 a ch b=? ,将结果赋给c */case '+' :c=a+b;break;case '-' :c=a-b;break;case
9、9;*' :c=a*b;break;case '/' :if(b!=0)c=a/b;else4 / 7.printf(" 分母为零 !");push_seqstack1(S,c);/* 将 c 压入栈中 */ch=*A+; /* 指针向下移动一位*/* 遇到 '#'循环结束 */gettop_seqstack1(S,&result);/* 此时栈顶元素即为计算结果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 指向的中缀表达式转换为指针 postfixexp 指向的后缀表达式 */ int infix_exp_value(char *infixexp,char *postfixexp)pseqstack2 S; /* 定义栈 S*/i
11、nt count=0;char w;/* 存放读取到的表达式(infixexp) 的字符 */char c;/* 存放栈顶元素*/char topelement;/*存出栈元素 */S=init_seqstack2(); /* 初始化栈 */if(!S) /* 栈的初始化判断*/printf(" 栈初始化失败!");return 0;push_seqstack2(S,'#');/* 将结束符 '# '加入运算符栈S 中*/w=*infixexp;/* 读表达式字符 =>w*/while(gettop_seqstack2(S,&c
12、),c)!='#'|w!='#')/*<3>栈顶元素不等于'#'或 w 不等于 '#'时循5 / 7.环*/if(isnum(w)/* 判断 w 是否为操作数 ,若是直接输出 ,读下一个字符 =>w,转 <3>*/ if(count)*postfixexp=''postfixexp+;count=0;*postfixexp=w;postfixexp+;w=*(+infixexp);else /*w 若是运算符分类如下*/count=1;if( (gettop_seqstack2(S,&
13、amp;c),c)='(' && w=')' )/* 如果栈顶为 '('并且 w 为 ')'则 '('出栈不输出 ,读下一个字符 =>w,转 <3>*/pop_seqstack2(S,&topelement); /* 将 '(' 出栈存入 topelement*/ w=*(+infixexp);elseif(gettop_seqstack2(S,&c),c)='('|priority(gettop_seqstack2(S,&c
14、),c)<priority(w) )/* 如果栈顶为 '(' 或者栈顶优先级小于 w 优先级 ,则 w 入栈 ,读下一个字符 =>w,转 <3>*/push_seqstack2(S,w);w=*(+infixexp);else/* 否则 */* 从运算符栈中出栈并输出,转<3>*/pop_seqstack2(S,&topelement);*postfixexp=topelement;postfixexp+;*postfixexp='#'/* 在指针 postfixexp 指向的后缀表达式结尾追加字符 '#'*/ *(+postfixexp)='0'/* 在指针 postfixexp 指向的后缀表达式最后追加结束符 '0'*/ return 1;6 / 7./* 主函数 */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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 华师大版初中科学课件
- 华师大版初中科学3.3 阳光的组成(14课件)
- 2023-2024学年浙江省宁波市余姚市子陵中学教育集团子陵校区七年级(下)竞赛数学试卷
- 上班迟到与旷工处理制度
- 逻辑代数基本公式及定律
- 2022年三年级语文下册第八单元主题阅读+答题技巧(含答案、解析)部编版
- 佛山市重点中学2024届高三模拟考试(一)数学试题理试卷
- 算法设计与分析 课件 10.3.4-综合应用-最短路径问题-弗洛伊德算法
- 2024年河北客运资格专业能力考试题库
- 2024年红河客运从业资格证考试答案
- 工业催化课件
- 小学六年级语文(小升初)修改病句专项练习题(含答案)
- 人教版六年级音乐上册全册教案
- 办税服务外包投标方案(技术标)
- 部编版五年级上册道德与法治第三单元知识点归纳整理
- 养老机构(养老院)全套服务管理实用手册
- 学校安全隐患排查整治表
- 企业文化管理第八章企业文化的比较与借鉴
- WST311-2023《医院隔离技术标准》
- 《缕书香伴我同行》课件
- 建设项目竣工环境保护验收管理办法
评论
0/150
提交评论