算术表达式的转换
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
前缀式可以由后缀式得到,将输入的数据逆序后,用后缀式的相似规则求出结果在逆序输出即可得到前缀式。
求前缀式的与后缀式的相似规则是,* / 不能弹出 * / ,+ -只能弹出 * / 。注意逆序后 “)”,要按照“(”处理,“(”,要按照“)”处理 中缀式 就直接把()去掉输出即可。
#include <stdio.h>
#include <stdlib.h>#include <string.h>
typedef struct {
char *base;
char *top;
int Lsize;
}Sqstack;
Sqstack Create(Sqstack &s)
{
s.base=(char *)malloc(1010*sizeof(char));
s.top=s.base;
return s;
}
Sqstack push(Sqstack &s,char e){
*s.top++=e;
}
char gettop(Sqstack &s)
{
char e;
e=*(s.top-1);
return e;
}
char pop(Sqstack &s){
char a;
if(s.top==s.base)return -1;
s.top--;
a=*s.top;
if(a!='('&&a!=')')
printf("%c",a);
return a ;
}
char pop1(Sqstack &s){
char a;
if(s.top==s.base)return -1;
s.top--;
a=*s.top;
return a ;
}
int Empty(Sqstack &s){
if(s.top==s.base) return 1;
else return 0;
}
char clearstack(Sqstack &s){
s.top=s.base;
}
char Conversion1(Sqstack &s,char b[],int l)
{
int i;
for(i=0;i<l-1;i++){
if(b[i]>=97&&b[i]<=122)
printf("%c",b[i]);
else if(b[i]=='+'||b[i]=='-'){
while(!Empty(s)&&gettop(s)!='('){
pop(s);
}
push(s,b[i]);
}
else if(b[i]=='/'||b[i]=='*'){
while(gettop(s)=='*'||gettop(s)=='/'&&!Empty(s))
{
pop(s);
}
push(s,b[i]);
}
else if(b[i]=='('){
push(s,b[i]);
}
else if(b[i]==')'){
while(gettop(s)!='('){
pop(s);
}
pop(s);
}
while(i==l-2&&!Empty(s)){
pop(s);
}
}
clearstack(s);
}
char Conversion2(Sqstack &s,char b[],int l)
{
Sqstack H;
H=Create(H);
int i;
for(i=0;i<l-1;i++){
if(b[i]>=97&&b[i]<=122)
{
push(H,b[i]);
}
else if(b[i]=='+'||b[i]=='-'){
while(gettop(s)=='*'||gettop(s)=='/'){
push(H,gettop(s));
pop1(s);
}
push(s,b[i]);
}
else if(b[i]=='/'||b[i]=='*'){
push(s,b[i]);
}
else if(b[i]=='('){
while(gettop(s)!='('){
push(H,gettop(s));
pop1(s);
}
pop1(s);;
}
else if(b[i]==')'){
push(s,'(');
}
while(i==l-2&&!Empty(s)){
push(H,gettop(s));
pop1(s);
}
}
while(!Empty(H)){
gettop(H);
pop(H);
}
}
char Conversion3(char b[],int l)
{
int i;
for(i=0;i<l-1;i++){
if(b[i]!='('&&b[i]!=')')
printf("%c",b[i]);
}
}
char Inverse(char c[],char d[],int l)
{
int i,j;
j=l-2;
for(i=0;i<l-1;i++){
d[j]=c[i];
j--;
}
return *d;
}
int main()
{
int i,j,len;
char a[1001],b[1001];
Sqstack S;
S=Create(S);
scanf("%s",&a);
len=strlen(a);
*b=Inverse(a,b,len);
Conversion2(S,b,len);
printf("\n");
Conversion3(a,len);
printf("\n");
Conversion1(S,a,len);
}