博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算术表达式的转换
阅读量:5153 次
发布时间:2019-06-13

本文共 2379 字,大约阅读时间需要 7 分钟。

算术表达式的转换

Time Limit: 1000MS Memory limit: 65536K

题目描述

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

输入

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

输出

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

示例输入

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

示例输出

+*ab*-c/defa*b+c-d/e*fab*cde/-f*+
(不懂的地方欢迎私信我,我看到的话一定会第一时间给你解答)

#include <stdio.h>

#include <string.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));   //清空a字符串数组 
    stack<char>sl;   //这是参数化模板,声明存放char类型的stack容器
    cnt=0;  //初始化
    for(int i=0; i<len; i++)  //分情况讨论1.2.3.4.5.6
    {  
        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;  
}  

转载于:https://www.cnblogs.com/CCCrunner/p/6444634.html

你可能感兴趣的文章
Lua学习笔记之开始
查看>>
poj 1797 Heavy Transportation
查看>>
canvas计算高度(自定义高度)
查看>>
在Visual Studio 2010中使用gtest
查看>>
0115 创建类并调用
查看>>
pc/app 项目/功能设计
查看>>
IIS并发连接数和数据库连接池
查看>>
c#操作IIS之IISHelper
查看>>
VIJOS P1540 月亮之眼
查看>>
Job流程:提交MR-Job过程
查看>>
成功也不需要太长的时间
查看>>
【6.29】数组和方法
查看>>
Tomcat会话保持配置方案
查看>>
spoj104 highways 生成树计数(矩阵树定理)
查看>>
sencha touch之模型(model)
查看>>
Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
查看>>
对ThinkPHP 框架看法和建议
查看>>
C# 客户端调用web服务 wsdl转成dll调用
查看>>
C# 事务之SqlTransaction
查看>>
简单工厂模式
查看>>