中缀式变后缀式

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述
人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
 
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组中缀式相应的后缀式,要求相邻的操作数操作符用空格隔开。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.000 2 4 / + =
1 2 + 5 * 1 + 4 / =
 /**
分析:
Ⅰ、建立stack (放操作符)、queue (放操作结果)
Ⅱ、isdigit (s [i]) || s [i] == '.' 直接 queue.push (s [i])
Ⅲ、s [i] == '(' 入栈
Ⅳ、s [i] == ')' 将 '(' 以上的所有运算符出栈 (入队列),最后将 '(' 出栈
Ⅴ、遇到操作符判断其和栈顶元素的关系
Ⅴ(①)、如果 priority (stack.top()) >= priority (s [i]), 出栈 (入队列)
Ⅵ、将stack中除 '#' 以外所有的运算符出栈(入队列)
**/

核心代码:

 /**
for (int i = 0; i < len; ++ i) {
if (isdigit (s [i]) || s [i] == '.')
que.push (s [i]);
else if (s [i] == '(')
sta.push (s [i]);
else if (s [i] == ')') {
char c = sta.top ();
while (c != '(') {
que.push (c);
que.push (' ');
sta.pop ();
c = sta.top ();
}
sta.pop ();
} else {
char c = sta.top ();
while (priority (c) >= priority (s [i])) {
que.push (c);
que.push (' ');
sta.pop ();
c = sta.top ();
}
} if (isdigit (s [i]) && (s [i + 1] == '/' || s [i + 1] == '+' ||
s [i + 1] == '-' || s [i + 1] == '*' || s [i + 1] == '=' || s [i + 1] == ')')) {
que.push (' ');
}
}
**/

C/C++代码实现(AC):

 #include <bits/stdc++.h>

 using namespace std;

 int priority (char c) {
if (c == '/' || c == '*') return ;
if (c == '+' || c == '-') return ;
if (c == '=') return ;
return ;
} int main () {
int T;
scanf ("%d", &T);
while (T --) {
char s [];
int len;
queue <char> que;
stack <char> sta;
sta.push ('#'); getchar ();
scanf ("%s", &s[]);
len = strlen (s); for (int i = ; i < len; ++ i) {
if (isdigit (s [i]) || s [i] == '.') {
que.push (s [i]);
} else if (s [i] == '(') {
sta.push (s [i]);
} else if (s [i] == ')') {
char c = sta.top ();
while (c != '(') {
que.push (c);
que.push (' '); // 运算符间空格
sta.pop ();
c = sta.top ();
}
sta.pop ();
} else {
char c = sta.top ();
while (!sta.empty() && priority (c) >= priority (s [i])) {
que.push (c);
que.push (' '); // 运算符间空格
sta.pop ();
c = sta.top ();
}
sta.push (s [i]);
} if (isdigit (s [i]) && (s [i + ] == '/' || s [i + ] == '+' ||
s [i + ] == '-' || s [i + ] == '*' || s [i + ] == '=' || s [i + ] == ')')) {
// 数字与运算符间空格
que.push (' ');
}
}
while (!sta.empty () && sta.top () != '#') {
que.push (sta.top ());
sta.pop ();
}
while (!que.empty ()) {
printf ("%c", que.front ());
que.pop ();
}
printf ("\n");
}
return ;
}

nyoj 467 中缀式变后缀式 (栈)的更多相关文章

  1. NYOJ467 中缀式变后缀式 【栈】

    中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式.关于算术 ...

  2. NYOJ 467 中缀式变后缀式

    做了表达式求值那道题之后做的 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后 ...

  3. NYOJ--257--郁闷的C小加(一)(中缀表达式变后缀表达式 )

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说 ...

  4. [Code] 中缀式转后缀式

    [Code] 中缀式转后缀式 概要 对于一个可带括号的中缀四则运算表达式, 例如30 + 4 / 2 或 30 / ( 4 + 2 ), 下面代码将分别转换为对应的后缀表达形式 30 4 2 / + ...

  5. 中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)

    定义: 中缀表达式: 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表达式 后缀表达式: 又叫逆波兰表达式 ,不包含括号,运算符放在两个运算对象的后面,所有的计算 ...

  6. 栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)

    一.前言   普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...

  7. SDUT 2133 数据结构实验之栈三:后缀式求值

    数据结构实验之栈三:后缀式求值 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是 ...

  8. SDUT-2133_数据结构实验之栈与队列三:后缀式求值

    数据结构实验之栈与队列三:后缀式求值 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运算符的后缀表示式 ...

  9. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

随机推荐

  1. PHP get_object_vars 和 get_class_vars

    <?php class Girl { public $id = 1; public $name = 'zhy'; } $girl = new Girl(); var_dump(get_class ...

  2. Cocos2d-x 学习笔记(15.2) EventDispatcher 事件分发机制 dispatchEvent(event)

    1. 事件分发方法 EventDispatcher::dispatchEvent(Event* event) 首先通过_isEnabled标志判断事件分发是否启用. 执行 updateDirtyFla ...

  3. 日志::spdlog

    https://github.com/gabime/spdlog git clone https://github.com/gabime/spdlog.git cd spdlog && ...

  4. PHP代码审计基础-高级篇

    高级篇主要讲 1. 熟知各个开源框架历史版本漏洞. 2. 业务逻辑漏洞 3. 多线程引发的漏洞 4. 事务锁引发的漏洞 在高级篇审计中有很多漏洞正常情况下是不存在的只有在特殊情况下才有 PHP常用框架 ...

  5. 【Leetcode 做题学算法周刊】第一期

    首发于微信公众号<前端成长记>,写于 2019.10.28 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 1. ...

  6. WebShell代码分析溯源(一)

    WebShell代码分析溯源(一) 一.一句话变形马样本 <?php $_GET['POST']($_POST['GET']);?> 二.代码分析 1.调整代码格式 <?php $_ ...

  7. MySQL操作(一)用户及权限

    一.mysql 里的所有用户都是存储在数据库mysql的user表里 二.创建普通用户.赋权.撤销权限 的操作 1.创建用户(需要先用root进去mysql)格式:create  user  '用户名 ...

  8. LeetCode 十月份题目汇总

    开源地址:点击该链接 前言 十月份共有60道题目,全部属于 Easy 难度的,所以公众号中分享出来的并不多,只是挑了一些感觉还可以的才分享了出来,这60道题目我按照不同类别进行了分类整理,所有源码以及 ...

  9. 使用webpack命令打包时,报错TypeError: Cannot read property 'presetToOptions' of undefined的解决办法

    我只安装了webpack,没有安装webpack-cli,第一次输入webpack打包时,提示 One CLI for webpack must be installed. These are rec ...

  10. Spring(五)Spring缓存机制与Redis的结合

    一.Redis和数据库的结合 使用Redis可以优化性能,但是存在Redis的数据和数据库同步的问题. 例如,T1时刻以将 key1 保存数据到 Redis,T2时刻刷新进入数据库,但是T3时刻发生了 ...