中缀式变后缀式

时间限制: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. Vulnhub靶场渗透练习(五) Lazysysadmin

    第一步扫描ip    nmap 192.168.18.*  获取ip 192.168.18.147 扫描端口 root@kali:~# masscan - --rate= Starting massc ...

  2. java学习5-面向对象(下)

    final修饰符: final用于修饰类.变量和方法. final修饰变量时,一旦获得了初始值就不可改变 1.抽象方法和抽象类 抽象方法与抽象类的规则: a.抽象方法和抽象类必须使用abstract修 ...

  3. instruments无法连接,设备查询不到,找不到工程,查询不到对应app

    这种问题真是让人捉急,一定要沐浴更衣,怀着一颗虔诚的心. 1.拔掉设备(iPhone/iPad),关掉设备.(长按电源键) 2.关闭Xcode和Instruments 3.重启设备(iPhone/iP ...

  4. [AHOI2002]哈利·波特与魔法石

    这道题比较简单,就是一个最短路(SSSP).数据水,用Floyd即可AC.这里用了Dijkstra. #include <iostream> #include <cstdio> ...

  5. 像使用SQL一样对List对象集合进行排序

    在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分).你知道怎么对一个Movie对象组 ...

  6. 云开发如何解决serverless对端的最后一公里问题

    前端圈从来不缺少新的技术.点子和话题,有些留下来了而有些则转瞬即逝.在决定一种新技术是否能够长久的所有因素里,最核心的必然是自身实力过硬能够经受住实践检验.而除此之外,这项技术所解决问题的广泛程度.受 ...

  7. Excel在线预览(通过poi转html,含里面的图片)

    支持03和07excel转html,直接上代码 测试类 /** * 主方法 * @author asus * */ public class App2 { public static void mai ...

  8. rsync的笔记整理

    Rsyncd数据同步工具 1.什么是Rsyncs? Rsync(Remote synchronization)是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsy ...

  9. Scrapy 之settings配置

    BOT_NAME 默认: 'scrapybot' 当您使用 startproject 命令创建项目时其也被自动赋值. ROBOTSTXT_OBEY = False 是否遵守rebotes.txt协议 ...

  10. 如何用好redis pipeline

    编者注:pipeline是Redis的一个提高吞吐量的机制,适用于多key读写场景,比如同时读取多个key的value,或者更新多个key的value.工作过程中发现挺多小伙伴都对pipeline多少 ...