算术表达式的转换

算术表达式的转换
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description

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

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

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

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

+ab-c/def
ab+c-d/ef
abcde/-f+
Hint

以下引用自 chensongxian 博客园
将中缀表达式转换为前缀表达式

转换步骤如下:

1.初始化两个栈:运算符栈s1,储存中间结果的栈s2
2.从右至左扫描中缀表达式
3.遇到操作数时,将其压入s2
4.遇到运算符时,比较其与s1栈顶运算符的优先级
如果s1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈
否则,若优先级比栈顶运算符的较高或相等,也将运算符压入s1
否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较
5.遇到括号时
如果是右括号“)”,则直接压入s1
如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃
6.重复步骤2至5,直到表达式的最左边
7.将s1中剩余的运算符依次弹出并压入s2
8.依次弹出s2中的元素并输出,结果即为中缀表达式对应的前缀表达式

将中缀表达式转换为后缀表达式
1.初始化两个栈:运算符栈s1和储存中间结果的栈s2;
2.从左至右扫描中缀表达式;
3.遇到操作数时,将其压s2;
4.遇到运算符时,比较其与s1栈顶运算符的优先级:
如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
否则,若优先级比栈顶运算符的高,也将运算符压入s1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;
5.遇到括号时:
如果是左括号“(”,则直接压入s1;
如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃;
6.重复步骤2至5,直到表达式的最右边;
7.将s1中剩余的运算符依次弹出并压入s2;
8.依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)

#include <stdio.h>
#include <stack>
#include <string.h>
using namespace std;
int judge1(char a,char b)  //前缀比较判断
{
    if((a=='*'||a=='/')&&(b=='*'||b=='/'))
        return 1;
    if((a=='+'||a=='-')&&(b=='+'||b=='-'))
        return 1;
    if((a=='+'||a=='-')&&(b=='*'||b=='/'))
        return 1;
    if((a=='*'||a=='/')&&(b=='+'||b=='-'))
        return 0;
}
int judge2(char a,char b)   //后缀比较判断
{
    if((a=='*'||a=='/')&&(b=='*'||b=='/'))
        return 0;
    if((a=='+'||a=='-')&&(b=='+'||b=='-'))
        return 0;
    if((a=='+'||a=='-')&&(b=='*'||b=='/'))
        return 1;
    if((a=='*'||a=='/')&&(b=='+'||b=='-'))
        return 0;
}
int main()
{
    char s[101];
    int i;
    gets(s);
    stack<char>s1;
    stack<char>s2;
    int len=strlen(s);
    for(i=len-2; i>=0; i--)
    {
        if(s[i]>='a'&&s[i]<='z')  
        {
            s2.push(s[i]);
        }
        else
        {
            if(s1.empty()||s1.top()==')'||s[i]==')')
            {
                s1.push(s[i]);
                continue;
            }
            if(s[i]=='(')
            {
                while(s1.top()!=')')
                {
                    s2.push(s1.top());
                    s1.pop();
                }
                s1.pop();
                continue;
            }
            if(!s1.empty())
            {
                if(judge1(s1.top(),s[i]))
                {
                    s1.push(s[i]);
                }
                else
                {
                    while(!s1.empty())
                    {
                        if(judge1(s1.top(),s[i])==1) break;
                        if(s1.top()==')') break;
                        s2.push(s1.top());
                        s1.pop();
                    }
                    s1.push(s[i]);
                }
            }
        }
    }
    while(!s1.empty())
    {
       // printf("%c",s1.top());
        s2.push(s1.top());
        s1.pop();
    }
   // printf("\n");
    while(!s2.empty())
    {
        printf("%c",s2.top());
        s2.pop();
    }
    printf("\n");
    for(i=0;i<len-1;i++)
    {
        if(s[i]!='('&&s[i]!=')')
        printf("%c",s[i]);
    }printf("\n");
    for(i=0; i<len-1; i++)
    {
        if(s[i]>='a'&&s[i]<='z')
        {
            s2.push(s[i]);
        }
        else
        {
            if(s1.empty()||s1.top()=='('||s[i]=='(')
            {
                s1.push(s[i]);
                continue;
            }
            if(s[i]==')')
            {
                while(s1.top()!='(')
                {
                    s2.push(s1.top());
                    s1.pop();
                }
                s1.pop();
                continue;
            }
            if(!s1.empty())
            {
                if(judge2(s1.top(),s[i]))
                {
                    s1.push(s[i]);
                }
                else
                {
                    while(!s1.empty())
                    {
                        if(judge2(s1.top(),s[i])==1) break;
                        if(s1.top()=='(') break;
                        s2.push(s1.top());
                        s1.pop();
                    }
                    s1.push(s[i]);
                }
            }
        }
    }
    while(!s1.empty())
    {
       // printf("%c",s1.top());
        s2.push(s1.top());
        s1.pop();
    }
    //printf("\n");
    int cn=0;
    char s3[10001];
    while(!s2.empty())
    {
        s3[cn++]=s2.top();
        s2.pop();
    }
    for(i=cn-1;i>=0;i--) printf("%c",s3[i]);
    printf("\n");
    return 0;
}

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

余额充值