算术表达式的转换

这道题卡了好久,从网上找的代码,但不是用栈做的,保存起来当算法看吧。

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;
}


算术表达式转换后缀表达式的步骤如下: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右扫描中缀表达式。 3. 如果扫描到的是操作数,将其加入输出队列。 4. 如果扫描到的是左括号,将其压入栈中。 5. 如果扫描到的是右括号,则将栈中的元素依次弹出并加入输出队列,直到遇到左括号为止。左括号右括号都不输出到结果队列。 6. 如果扫描到的是运算符,判断其优先级: - 如果该运算符的优先级低于或等于栈顶运算符的优先级,则将栈顶运算符弹出并加入输出队列,直到栈为空或者栈顶运算符优先级低于该运算符。 - 将该运算符压入栈中。 7. 重复步骤2到6,直到扫描完整个中缀表达式。 8. 如果栈中还有运算符,将它们依次弹出并加入输出队列。 9. 输出队列中的元素就是后缀表达式。 例如,将中缀表达式 "5 + 4 * 3 - 2" 转换后缀表达式: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右扫描中缀表达式,首先遇到操作数 "5",将其加入输出队列。 3. 遇到运算符 "+",将其压入栈中。 4. 遇到操作数 "4",将其加入输出队列。 5. 遇到运算符 "*",由于 "*" 的优先级高于 "+",所以将 "*" 压入栈中。 6. 遇到操作数 "3",将其加入输出队列。 7. 遇到运算符 "-",由于 "-" 的优先级低于 "*",所以将 "*" 弹出并加入输出队列,然后将 "-" 压入栈中。 8. 遇到操作数 "2",将其加入输出队列。 9. 扫描完整个表达式后,将栈中剩余的运算符依次弹出并加入输出队列,得到后缀表达式 "5 4 3 * + 2 -"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值