这道题卡了好久,从网上找的代码,但不是用栈做的,保存起来当算法看吧。
http://www.cnblogs.com/kuangdaoyizhimei/archive/2013/07/30/3225080.html
算术表达式的转换
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<string.h>
#include<stdlib.h>
char g[200];
int top=-1;
int cmp(char ch)//比较优先级
{
if(ch=='+'||ch=='-')return 1;
if(ch=='*'||ch=='/')return 2;
if(ch=='(')return 3;
}
void ruzhan(char ch)//入栈操作
{
top++;
g[top]=ch;
}
void houzhui(char f[])//将中缀式转换成后缀式的函数
{
int i;
for(i=0;f[i]!='#';i++)
{
if((f[i]>='0'&&f[i]<='9')||(f[i]>='a'&&f[i]<='z'))//如果是字母或者是数字,就直接输出
printf("%c",f[i]);
else //如果是运算符的话
{
if(f[i]=='(')ruzhan('(');//如果是左括号直接入栈
else if(f[i]==')')//如果是右括号的话,将左括号以前的出栈并且删除括号
{
for(;g[top]!='(';top--)
printf("%c",g[top]);
top--;
}
else //如果是其他运算符,这里特指加减乘除运算
{
if(cmp(g[top])>=cmp(f[i]))//如果栈顶元素大于等于当前元素
{
if(g[top]=='(')ruzhan(f[i]);//栈顶元素是左括号的情况,当前元素直接进栈
else//当前元素不是左括号
{
printf("%c",g[top]);//输出栈顶元素
g[top]=f[i];//用当前元素覆盖栈顶元素
}
}
else//如果栈顶元素小于当前元素
{
ruzhan(f[i]);//当前元素直接进栈
}
}
}
}
//栈中剩余元素全部输出
for(;top>=0;top--)
printf("%c",g[top]);
top=-1;
printf("\n");
}
void qianzhui(char f[])//将中缀式转换成前缀式的函数
{
char fj[200];
int flag=0;
int t=strlen(f);
int i,j;
char gh[200];
for(i=t-2,j=0;i>=0;i--,j++)
gh[j]=f[i];
gh[j]='#';
for(i=0;gh[i]!='#';i++)
{
if((gh[i]>='0'&&gh[i]<='9')||(gh[i]>='a'&&gh[i]<='z'))//如果是字母或者是数字,就直接输出
{
fj[flag]=gh[i];
flag++;
}
else //如果是运算符的话
{
if(gh[i]==')')ruzhan(')');//如果是右括号直接入栈
else if(gh[i]=='(')//如果是左括号的话,将右括号以前的出栈并且删除括号
{
for(;g[top]!=')';top--)
{
fj[flag]=g[top];
flag++;
}
top--;
}
else //如果是其他运算符,这里特指加减乘除运算
{
if(cmp(g[top])>cmp(gh[i]))//如果栈顶元素大于等于当前元素,这里的if后面的大于号“>”是很重要的区分(和后缀式的代码相比较)
{
if(g[top]==')')ruzhan(gh[i]);//栈顶元素是右括号的情况,当前元素直接进栈
else//当前元素不是右括号
{
{
fj[flag]=g[top];
flag++;
}//输出栈顶元素
g[top]=gh[i];//用当前元素覆盖栈顶元素
}
}
else//如果栈顶元素小于当前元素
{
ruzhan(gh[i]);//当前元素直接进栈
}
}
}
}
//栈中剩余元素全部输出
for(i=0;top>=0;top--,i++)
{
fj[flag]=g[top];
flag++;
}
for(i=flag-1;i>=0;i--)
printf("%c",fj[i]);
printf("\n");
}
void zhongzhui(char f[])//将中缀式转换成中缀式的函数(去括号)
{
int i;
for(i=0;f[i]!='#';i++)
{
if(f[i]!='('&&f[i]!=')')
printf("%c",f[i]);
}
printf("\n");
}
int main()
{
char f[200];
scanf("%s",f);
qianzhui(f);
zhongzhui(f);
houzhui(f);
return 0;
}