算术表达式的转换

本文介绍了一种将算术表达式转换为前缀式、中缀式和后缀式的方法。通过栈结构处理运算符与操作数,实现不同形式间的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算术表达式的转换

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>    
#define Max  1000    
struct node    
{    
char data[Max];    
int top;    
};    
int cmp(char  c)    
{    
if(c=='+'||c=='-')    
return 1;    
if(c=='*'||c=='/')    
return 2;    
if(c=='('||c==')')    
return 3;    
}    
int main()    
{    
int i,j,n,m,k,t;    
char a[1000];    
struct node *S1,*S2;    
S1=(struct node *)malloc(sizeof(struct node));    
S2=(struct node *)malloc(sizeof(struct node));    
a[0]=getchar();    
i=0;    
while(a[i]!='#')    
{    
i++;    
a[i]=getchar();    
}    
S1->top=-1;    
S2->top=-1;    
for(j=i-1;j>=0;j--)    
{    
if(a[j]!='('&&a[j]!=')'&&a[j]!='+'&&a[j]!='-'&&a[j]!='*'&&a[j]!='/')    
{    
S2->top++;    
S2->data[S2->top]=a[j];    
}    
else    
{    
if(S1->top==-1||a[j]==')')    
{    
S1->top++;    
S1->data[S1->top]=a[j];    
}    
else if(cmp(a[j])>cmp(S1->data[S1->top])||cmp(a[j])==cmp(S1->data[S1->top]))    
{    
if(a[j]!='(')    
{    
S1->top++;    
S1->data[S1->top]=a[j];    
}    
else    
{    
while(S1->top>-1&&S1->data[S1->top]!=')')    
{    
S2->top++;    
S2->data[S2->top]=S1->data[S1->top];    
S1->top--;    
}    
S1->top--;    
}    
}    
else    
{    
while(S1->top>-1&&S1->data[S1->top]!=')')    
{    
S2->top++;    
S2->data[S2->top]=S1->data[S1->top];    
S1->top--;    
}    
S1->top++;    
S1->data[S1->top]=a[j];    
}    
}    
}    
for(j=0;j<=S1->top;j++)    
printf("%c",S1->data[j]);    
for(j=S2->top;j>=0;j--)    
printf("%c",S2->data[j]);    
printf("\n");    
for(j=0;j<i;j++)    
if(a[j]!=')'&&a[j]!='(')    
printf("%c",a[j]);    
printf("\n");    
S1->top=-1;    
S2->top=-1;    
for(j=0;j<i;j++)    
{    
if(a[j]!='('&&a[j]!=')'&&a[j]!='+'&&a[j]!='-'&&a[j]!='*'&&a[j]!='/')    
{    
S2->top++;    
S2->data[S2->top]=a[j];    
}    
else    
{    
if(S1->top==-1||a[j]=='(')    
{    
S1->top++;    
S1->data[S1->top]=a[j];    
}    
else if(a[j]==')')    
{    
while(S1->top>-1&&S1->data[S1->top]!='(')    
{    
S2->top++;    
S2->data[S2->top]=S1->data[S1->top];    
S1->top--;    
}    
if(S1->top>-1)    
S1->top--;    
}    
else if(cmp(a[j])>cmp(S1->data[S1->top])||S1->data[S1->top]=='(')    
{    
S1->top++;    
S1->data[S1->top]=a[j];    
}    
else    
{    
while(S1->top>-1&&cmp(a[j])<=cmp(S1->data[S1->top])&&S1->data[S1->top]!='(')    
{    
S2->top++;    
S2->data[S2->top]=S1->data[S1->top];    
S1->top--;    
}    
S1->top++;    
S1->data[S1->top]=a[j];    
}    
}    
}    
for(j=0;j<=S2->top;j++)    
printf("%c",S2->data[j]);    
for(j=S1->top;j>=0;j--)    
printf("%c",S1->data[j]);    
printf("\n");    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值