7-20 表达式转换(栈)[通俗易懂]

7-20 表达式转换(栈)[通俗易懂]原题链接算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。输入格式:输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。输出格式:在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。输入样例:2+3*(7-4)+8/4输出样例:2 3 7 4 – * + 8 4 / +注意

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

原题链接
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。

输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

注意
数字前面有正负号和小数的情况

#include<bits/stdc++.h>
#define x first
#define y second
#define send string::npos
#define lowbit(x) (x&(-x))
using namespace std;
typedef long long ll;
const int N = 1e4 + 10;
const int M = 3 * N;
const int INF = 0x3f3f3f3f;
typedef pair<int,int> PII;
typedef struct Node * pnode;
    string line;
char isSignal(int u){ 
   
    if((line[u] == '+' && !(u - 1 == -1 || line[u -1] == '(' || line[u - 1] == '+' || line[u - 1] == '-'||line[u - 1] == '*'||line[u - 1] == '/'))  //此+号是运算符
       ||(line[u] == '-' && !(u - 1 == -1 || line[u -1] == '(' || line[u - 1] == '+' || line[u - 1] == '-'||line[u - 1] == '*'||line[u - 1] == '/'))    //此-号是运算符
       || line[u] == '/' || line[u] == '*' || line[u] == '(' || line[u] == ')')return true;
    else return false;
}
string getNum(int &u){ 
   
    bool flag = false;
    if(line[u] == '-' || line[u] == '+'){ 
   
        if(line[u] == '-')flag = true;
        u ++;
    }
    int i = u;
    while(isalnum(line[u]) || line[u] == '.')
        u ++;
    string re = "";
    if(flag)re = "-";
    re +=line.substr(i,u - i);
    return re;
}
int main(){ 
   
    getline(cin,line);
    int i = 0;
    string num;
    vector<string> res;
    stack<char>s;
    stringstream word;
    string x;
    while(i < line.size()){ 
   
        word.clear();
        if(isSignal(i)){ 
   
            if(line[i] == '*' || line[i] == '/'){ 
   
                s.push(line[i]);
            }
            else if(line[i] == '+' || line[i] == '-'){ 
   
                while(!s.empty() && (s.top() == '/' || s.top() == '*'|| s.top() == '+' || s.top() == '-')){ 
   
                    word.clear();
                    word << s.top();
                    word >> x;
                    res.push_back(x);
                    s.pop();
                }
                s.push(line[i]);
            }
            else if(line[i] == '('){ 
   
                s.push(line[i]);
            }else if(line[i] == ')'){ 
   
                while(!s.empty() && s.top() != '('){ 
   
                    word.clear();
                    word << s.top();
                    word >> x;
                    res.push_back(x);
                    s.pop();
                }
                if(s.top() == '(')s.pop();
            }
            i ++;
        }else { 
   
            num = getNum(i);
            word << num;
            word >> x;
            res.push_back(x);
        }
    }
    while(!s.empty()){ 
   
        word.clear();
        word << s.top();
        word >> x;
        res.push_back(x);
        s.pop();
    }
    cout<<res[0];
    for(int i = 1;i < res.size();i ++)
       cout<<" "<<res[i];

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168943.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月9日 上午9:00
下一篇 2022年8月9日 上午9:16


相关推荐

  • Java——JCF简介

    Java——JCF简介JCF 简介 JCF JavaCollecti Java 容器框架 一 Collection 和 CollectionFr 容器 能够存放数据的空间结构数组 多维数组 只能线性存放列表 散列集 树 容器框架 为表示和操作容器二规定的一种标准体系结构对外的接口 容器中能存放的抽象数据类型接口的实现 可复用的数据结构算法 对数据的

    2026年3月19日
    3
  • _beginthread, _beginthreadex

    _beginthread, _beginthreadex语法uintptr_t_beginthread(//NATIVECODEvoid(__cdecl*start_address)(void*),unsignedstack_size,void*arglist);uintptr_t_beginthread(//MANAGEDCODEvoid(__clrcall*start_add…

    2025年6月15日
    4
  • spssfisher判别分析步骤_SPSS判别分析

    spssfisher判别分析步骤_SPSS判别分析说明 非原创 借鉴网上多方材料整理 其中包括 CSDN 博主路易三十六 TOMOCAT 及百度资源整合做的一份学习笔记 与大家共享 一 定义判别分析又称 分辨法 是在分类确定的条件下 根据某一研究对象的各种特征值判别其类型归属问题的一种多变量统计分析方法 二 判别分析的一般形式 y a1x1 a2x2 anxn a1 为系数 Xn 为变量 事先非常明确共有几个类别 目的是从已知样本中训练出判别函数三

    2026年3月19日
    1
  • CMSIS的简介_CMSInitiatingOccupancyFraction

    CMSIS的简介_CMSInitiatingOccupancyFractionCortex微控制器软件接口标准(CortexMicrocontrollerSoftwareInterfaceStandard)是ARM和一些编译器厂家以及半导体厂家共同遵循的一套标准,是由A

    2022年8月6日
    17
  • 实体关系抽取实战_知识图谱实体关系抽取

    实体关系抽取实战_知识图谱实体关系抽取前言本篇博客主要讲NLP中的关系抽取,聚焦点中文,没有过多理论,侧重实践(监督学习)。关于实体关系抽取的技术发展脉络,感兴趣的可以看一下:https://www.cnblogs.com/theodoric008/p/7874373.html关系抽取有限定关系抽取和开放关系抽取,这里主要说限定关系抽取即分类问题其过程常常又有监督学习和半监督学习,这里主要讲利用深度学习进行的监督学…

    2025年8月1日
    5
  • ieee754标准一个浮点数由什么组成_某数采用ieee754单精度浮点数格式

    ieee754标准一个浮点数由什么组成_某数采用ieee754单精度浮点数格式浮点数(Floating-pointNumber)是对实数的一种近似表示,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次幂得到。以这种表示法表示的数值,称为浮点数。

    2025年8月22日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号