算术表达式的转换
来源:互联网 发布:外商投资网络支付机构 编辑:程序博客网 时间:2024/04/26 10:18
算术表达式的转换
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
Input
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
Output
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
+*ab*-c/defa*b+c-d/e*fab*cde/-f*+
我用到的是类和栈,主要是求前缀和后缀,前缀是倒着往前求,后缀是正着往后求,两者还有个不同是,前缀栈顶元素的优先级是大于要进栈的运算符的优先级,而后缀是大于等于要紧栈的运算符的优先级的。
#include<iostream>#include<string>#include<cstring>#include<string.h>#include<cstdio>#include<stdlib.h>using namespace std;const int maxsize=100;char ch1[100];char ch2[100];char ch3[100];//---------------------------------------------------------------------------------------------------------------------class Stack{ char StackList[maxsize];int top;public:Stack();bool isFull();bool isEmpty();void Push(char e);char Pop(); char GetPop();void Pre(char a[]);//前缀void In(char a[]);//中缀void Pro(char a[]);//后缀int Compare(char m);void Clear();};//--------------------------------------------------------------------------------------------------------------Stack::Stack(){ top=-1;}bool Stack::isEmpty(){ if(top==-1) return true; else return false;}bool Stack::isFull(){ if(top==maxsize-1) return true;else return false;}void Stack::Push(char e){ if(isFull()) exit(0);StackList[++top]=e;}char Stack::Pop(){ if(isEmpty()) exit(0);return StackList[top--];}//---------------------------------------------------------------------------------------------------------------------char Stack::GetPop(){ //if(isEmpty()) exit(0); return StackList[top];}//-----------------------------------------------------------------------------------------------------------------int Stack::Compare(char m){ switch(m){case'(':case')': return 1;case'+':case'-': return 2;case'*':case'/': return 3;default: return 0;}}//----------------------------------------------------------------------------------------------------------------------void Stack::Clear(){ top=-1;}//----------------前缀-------------------------------------------------------------------------------------------------void Stack::Pre(char a[]){int j=0;int len=strlen(a);for(int i=len-2;i>=0;i--){ switch(a[i]) { case'+': case'*': case'/': case'-': { if(Compare(a[i])<Compare(GetPop())) while(Compare(a[i])<Compare(GetPop())) ch1[j++]=Pop(); Push(a[i]); break; } case')': { Push(a[i]); break; } case'(': { while(GetPop()!=')') ch1[j++]=Pop(); Pop(); break; } default: { ch1[j++]=a[i]; break; } }}while(GetPop()!='#')ch1[j++]=Pop();ch1[j]='\0';}//--------------中缀-------------------------------------------------------------------------------------------------void Stack::In(char a[]){int j=0;for(int i=0;a[i]!='#';i++) if(a[i]!='('&&a[i]!=')')ch2[j++]=a[i];ch2[j]='\0';}//-----------后缀---------------------------------------------------------------------------------------------------void Stack::Pro(char a[]){int j=0;for(int i=0;a[i]!='#';i++){ switch(a[i]) { case'+': case'-': case'*': case'/': { if(Compare(a[i])<=Compare(GetPop())) while(Compare(a[i])<=Compare(GetPop())) ch3[j++]=Pop(); Push(a[i]); break; } case'(': { Push(a[i]); break; } case')': { while(GetPop()!='(') ch3[j++]=Pop(); Pop(); break; } default: { ch3[j++]=a[i]; break; } }}while(GetPop()!='#')ch3[j++]=Pop();ch3[j]='\0';}//-----------------------------------------------------------------------------------------------------------------------int main(){ char a[100]; cin>>a; Stack s; Stack(); s.Push('#'); s.Pre(a); s.In(a); s.Pro(a); int len=strlen(ch1); for(int j=len-1;j>=0;j--) cout<<ch1[j]; cout<<endl; string c=ch2; cout<<c<<endl; c=ch3; cout<<c<<endl; s.Clear(); return 0; }
阅读全文
0 0
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 算术表达式的转换
- 【Hibernate】设置inverse属性,在多对多种维护关联关系的影响?
- 约瑟夫环
- MySQL 5.7 安装问题记录
- linux 5
- 算法学习之递归--汉诺塔问题
- 算术表达式的转换
- hdu5969最大的位或(二进制思维)
- 约瑟夫环问题的数组解法与单链表解法
- 一些常用的集合工具的代码块(缓慢更新XD)
- 数字
- 添加Cloud广告
- 【龙队的胡策】训练8.21(?+dp+lct)
- HDU --- 5446 Unknown Treasure 数论综合【Lucas定理 + 中国剩余定理 + 快速乘 + 思维】
- PHP面试(笔试)题