算术表达式的转换



题目描述

小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
   因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。

输入

 输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)

输出

 输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。

示例输入

a*b+(c-d/e)*f#

示例输出

+*ab*-c/def
a*b+c-d/e*f
ab*cde/-f*+

#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <string.h>
#include <stack>
using namespace std;
char a[150];
int len,cnt;
void solve(char *n,int f)            //标记变量f来记录是求前缀式还是后缀式;前缀式与后缀式有一点不同:对于前缀式,栈顶的符号优先级要大于即将要放入栈的符号的优先级,然后输出栈顶符号‘*’或‘/’,然后再将当前符号放入栈内;而对于后缀式,栈顶的符号优先级要大于等于当前符号的优先级,然后将栈顶符号‘*’或‘/’或‘+’或‘-’输出,然后再讲当前符号放入栈内。
{
    memset(a,0,sizeof(a));
    stack<char>sl;
    cnt=0;
    for(int i=0; i<len; i++)
    {
        if(n[i]<='z'&&n[i]>='a')
            a[cnt++]=n[i];
        else if(n[i]=='(')
            sl.push(n[i]);
        else if(n[i]==')')
        {
            while(sl.top()!='('&&!sl.empty())
            {
                a[cnt++]=sl.top();
                sl.pop();
            }
            sl.pop();
        }
        else if(n[i]=='+'||n[i]=='-')
        {
            if(f)
            {
                while(!sl.empty()&&sl.top()!='('&&(sl.top()=='*'||sl.top()=='/'))
                {
                    a[cnt++]=sl.top();
                    sl.pop();
                }
            }
            else
                while(!sl.empty()&&sl.top()!='(')
                {
                    a[cnt++]=sl.top();
                    sl.pop();
                }
            sl.push(n[i]);
        }
        else if(n[i]=='*'||n[i]=='/')
        {
            while(!sl.empty()&&sl.top()!='('&&(sl.top()=='*'||sl.top()=='/'))
            {
                a[cnt++]=sl.top();
                sl.pop();
            }
            sl.push(n[i]);
        }
    }
    while(!sl.empty())
    {
        a[cnt++]=sl.top();
        sl.pop();
    }
}
int main()
{
    char st[150],sa[150];
    memset(st,0,sizeof(st));         //清除原字符串
    memset(a,0,sizeof(a));           //清除经转换后的字符串
    memset(sa,0,sizeof(sa));         //清除倒置的字符串,用以转换前缀式
    while(~scanf("%s",st))
    {
        len=strlen(st)-1;            //把字符“#”去掉
        int i,j;
        for(i=0,j=len-1; i<len; i++,j--)
        {
            if(st[j]=='(')
                sa[i]=')';
            else if(st[j]==')')
                sa[i]='(';
            else
                sa[i]=st[j];
        }
        solve(sa,1);                 //得到前缀式
        for(i=cnt-1; i>=0; i--)
            printf("%c",a[i]);
        printf("\n");
        for(i=0; i<len; i++)         //对于中缀式记得把括号去掉
        {
            if(st[i]!='('&&st[i]!=')')
                printf("%c",st[i]);
        }
        printf("\n");
        solve(st,0);                 //得到后缀式
        for(i=0; i<cnt; i++)
            printf("%c",a[i]);
        printf("\n");
    }
    return 0;
}


 


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值