借助栈来实现单链表的逆置运算_中缀后缀表达式转换

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


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/168913.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 游戏常用算法-洗牌算法

    游戏常用算法-洗牌算法洗牌算法是一个比较常见的面试题。一副扑克54张牌,有54!种排列方式。最佳的洗牌算法,应该能够等概率地生成这54!种结果中的一种

    2022年7月3日
  • MacOS VSCode快捷键[通俗易懂]

    MacOS VSCode快捷键[通俗易懂]Macos下VSCode快捷键文章转载出处:http://www.cnblogs.com/informatics/全局Command+Shift+P/F1显示命令面板Command+P快速打开Command+Shift+N打开新窗口Command+W关闭窗口基本Command+X剪切(未选中文本的情况下,剪切光标所在行)Command+C复制(未选中文本的情况下,复制光标所在行)Option+Up向上移动行Option+D

    2022年6月4日
  • 为什么要设置环境变量,设置环境变量的作用在哪里[通俗易懂]

    为什么要设置环境变量,设置环境变量的作用在哪里[通俗易懂]1、什么是环境变量引用百度百科里面的解释:环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。看到这里我相信大家可能还是有所疑惑,但是,不急,接着看。2、为什么需要环境变量windows系统下,假如我们安装了某一款软件,安装结束后,在安装目录会生成一个该软件的.exe文件,双击该文件,我们就能启动软件。但是难道我们每次要运行该软件的时候都要先找到该.e

    2022年10月29日
  • 基于视频理解TSM和数据集Kinetics-400的视频行为识别

    基于视频理解TSM和数据集Kinetics-400的视频行为识别这个数据集包括了四百种的人体动作类别,每一种类别都至少有400个视频片段,每个片段都取自不同的Youtube视频,持续大概十秒。数据集的动作类别包括人和物体的交互-比如弹奏乐器;人与人的交互-比如握手。花了好久整理了Kinetics数据集,百度网盘下载地址:…

    2022年6月21日
  • 一个简单的Python暴力激活成功教程网站登录密码脚本「建议收藏」

    一个简单的Python暴力激活成功教程网站登录密码脚本「建议收藏」使用Python的Request库的get()方法来发送http请求,利用Python脚本循环遍历字典来进行暴力激活成功教程

    2022年8月22日
  • int使用规则_point是什么意思

    int使用规则_point是什么意思先说结论吧,方便快速查询验证。总结区别int类型大小为8字节int8类型大小为1字节int16类型大小为2字节int32类型大小为4字节int64类型大小为8字节go语言中的int的大小是和操作系统位数相关的,如果是32位操作系统,int类型的大小就是4字节;如果是64位操作系统,int类型的大小就是8个字节取值范围int8:-128~127int16:-32768~32767int32:-2147483648~214

    2022年8月15日

发表回复

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

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