算术表达式的转换
来源:互联网 发布:java中aes加密算法 编辑:程序博客网 时间:2024/05/16 18:32
算术表达式的转换
Time Limit: 1000MS Memory limit: 65536K
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/defa*b+c-d/e*fab*cde/-f*+
之前的代可能不太规范;现在还算规范
#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxsize 10000typedef char element;typedef struct{ element *top,*base; int sizestack;} Sq;int init(Sq &L){ L.base=new element; if(!L.base) exit(-1); L.top=L.base; L.sizestack=maxsize; return 0;}int isempty(Sq &L){ if(L.top<=L.base) return 1; else return 0;}int isfull(Sq &L){ if(L.top-L.base>L.sizestack-1) return 1; else return 0;}int getto(Sq &L){ int e; if(isempty(L)==1) return 0; return e=*(L.top);}int push(Sq &L,char t){ if(isfull(L)==1) return 0; *(++L.top)=t; return 0;}int pop(Sq &L){ if(isempty(L)==1) return 0; *(L.top--); return 0;}int main(){ char a[1000]; Sq L; Sq S; int i; char e; gets(a); int n=strlen(a); ///****************前缀输出********************************* init(L); init(S); for(i=n-2; i>=0; i--) { ///如果遇到“ )”进L1栈; if(a[i]==')') push(L,a[i]); ///如果遇到“( ”,如果L1栈顶不是“ )”,L1的栈顶元素,进S1栈,出L1栈;直到遇到“( ”,出L1栈 else if(a[i]=='(') { while(*(L.top)!=')') { e=getto(L); push(S,e); pop(L); } pop(L); } ///如果遇到“*”或“/”;进L1栈; else if(a[i]=='*'||a[i]=='/') { push(L,a[i]); } ///如果遇到“+”或“-”,如果L1的栈顶元素是“*”或“/”,L1的栈顶元素进S1栈,出L1栈;“+”或“-”进L1栈; else if(a[i]=='+'||a[i]=='-') { while(*(L.top)=='*'||*(L.top)=='/') { e=getto(L); push(S,e); pop(L); } push(L,a[i]); } ///字母直接进S1栈; else { push(S,a[i]); } } while(isempty(L)!=1) { e=getto(L); pop(L); push(S,e); } while(isempty(S)!=1) { e=getto(S); printf("%c",e); pop(S); } printf("\n");///********************中缀输出**************************** for(i=0; i<n-1; i++) if(a[i]!='('&&a[i]!=')') printf("%c",a[i]); printf("\n"); ///*********************后缀输出******************************** init(L); for(i=0; a[i]!='#'; i++) { ///遇到左括弧一律入栈; if(a[i]=='(') push(L,a[i]); ///遇到右括弧就把两个括弧之间的所有符号出栈输出,并且左括弧出栈; else if(a[i]==')') { while(isempty(L)!=1&&*(L.top)!='(') { e=getto(L); printf("%c",e); pop(L); } pop(L); } ///遇到“*”或“/”,如果栈不空并且栈顶不是左括弧并且栈顶是“*”或“/”,就把栈顶出栈输出,“*”或“/”入栈; else if(a[i]=='*'||a[i]=='/') { if((isempty(L)!=1)&&*(L.top)=='('&&(*(L.top)=='*'||*(L.top)=='/')) { e=getto(L); printf("%c",e); pop(L); } push(L,a[i]); } ///遇到“+”或“-”,如果栈不空并且栈顶不是左括弧就出栈输出这一个栈顶,“+”或“-”入栈; else if(a[i]=='+'||a[i]=='-') { if(isempty(L)!=1&&*(L.top)!='(') { e=getto(L); printf("%c",e); pop(L); } push(L,a[i]); } ///遇到字母一律输出; else { printf("%c",a[i]); } } while(isempty(L)!=1) { e=getto(L); printf("%c",e); pop(L); } printf("\n"); return 0;}
4 0
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 线程的基础
- 对数及对比度拉伸变换
- 自定义Toast显示效果
- 【C++】AfxBeginThread
- Leetcode - Array - 66. Plus One(简单模拟)
- 算术表达式的转换
- 【cpp面向对象编程学习笔记】(二)
- android studio 报错分析
- 根据顺序对个数找符合条件的数列
- ART世界探险(12) - OAT文件分析(2) - ELF文件头分析(中)
- 实现两台MPTCP主机之间的通信——VSFTPD的配置与使用
- 微软windows10 10周年更新出现0x80090004错误正确的解决方案
- Kafka集群搭建01-Zookeeper 集群部署
- java i/o流-----转换流