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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机按位取反[通俗易懂]

    计算机按位取反[通俗易懂]取反过程1.转成二进制2.取补码3.补码的反码(符号位不变)4.反码加+1可以通过原码、反码和补码三者的含义及关系来介绍三者之间的换算关系:1、原码原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如如果是8位二进制:[+1]原=00000001[-1]原=10000001第一位是符号位。2、反码

    2022年8月14日
    0
  • 盘点开发中那些常用的MySQL优化

    盘点开发中那些常用的MySQL优化

    2022年2月15日
    29
  • python aiohttp_python aiohttp的使用详解

    python aiohttp_python aiohttp的使用详解1.aiohttp的简单使用(配合asyncio模块)importasyncio,aiohttpasyncdeffetch_async(url):print(url)asyncwithaiohttp.request(“GET”,url)asr:reponse=awaitr.text(encoding=”utf-8″)  #或者直接awaitr.read()不编码,直接读取,适…

    2025年6月30日
    2
  • log4cxx–使用多个logger「建议收藏」

    log4cxx–使用多个logger「建议收藏」转载自:http://blog.csdn.net/crazyhacking/article/details/9668267使用多个logger时,所有logger的配置写在一个配置文件里面两个例子:1一个继承的例子(http://logging.apache.org/log4cxx/)//filecom/foo/bar.h#include”log4cxx/log

    2022年6月16日
    51
  • UCOSII系统时间管理[通俗易懂]

    UCOSII系统时间管理[通俗易懂]一,UCOSII的定时中断绝大多数的内核要求提供定时中断,以实现延时与超时控制等功能。这个定时中断叫做时钟节拍。时钟的中断子程序ISR和时钟节拍函数OSTimeTick()该函数通知UCOSII,发生了时钟节拍中断。二,UCOSII系统时钟函数1,任务延时函数,OSTimeDly(INT16Uticks)实现申请该服务的任务可以延时一段时间这个系统服务的函数叫做OSTimeDly(),这段时间的长短是用时钟节拍的数目来确定的。调用该函数会使µC/OS-Ⅱ进行一次任务调度,并且执行下一个优

    2022年5月4日
    112
  • Crackme 23[通俗易懂]

    Crackme 23[通俗易懂]Crackme23这题很好,一环扣一环。题目出的比较细致,有很多细节问题需要注意。也有此题看出,Crackme不能急,要一步一步的来

    2025年7月15日
    0

发表回复

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

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