中缀式变后缀式

时间限制: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. JavaScript七宗罪和一些槽点

    当下JavaScript越来越流行,成为长期霸语言榜前三的语言.但是实际上JavaScript是一个很丑陋有很多槽点的语言,这就是为什么新出了那么多框架(从jQuery到Vue)以及海尔斯伯格大大推出 ...

  2. ndnsim结果分析

    ndnSIM中提供了几种trace用来对仿真结果进行跟踪,生成数据文件txt 官网地址: https://ndnsim.net/current/metric.html#packet-trace-hel ...

  3. 浅谈爬虫 《一》 ===python

    浅谈爬虫 <一> ===python  ‘’正文之前先啰嗦一下,准确来说,在下还只是一个刚入门IT世界的菜鸟,工作近两年了,之前做前端的时候就想写博客来着,现在都转做python了,如果还 ...

  4. s32k144 bootloader

    s32k144 bootloader升级 mcu       : s32k144 can_tool : kvaser  摘要:实现can升级app程序,现在网上大多是CAN_FD升级bootloade ...

  5. 用Wireshark抓包分析请求

    前言 有些封装好的API把错误都屏蔽掉,直接返回某一个不明确的具体错误,让人感到困惑. //code in SDK read-only public static Data requestHandle ...

  6. codeblocks 调试不停止的解决办法。

    CB的工程路径不能有中文,也不能有空格. 所以一定要全英文路径,而且空格要用下划线代替. 否则,调试的时候,codeblocks不会在断点处停止.

  7. 记录一些常用的python库、软件或者网址

    1.数据收集 BeautifulSoup.scrapy.selenium.requests 2.数据分析 pandas.numpy.pyDD.spacy 3.数据可视化 matplotlib.seab ...

  8. Android Studio Module 引入aar

    1.把aar文件放到module的libs目录下 2.作为lib的module的gradle文件: repositories { flatDir { dirs 'libs' } } dependenc ...

  9. Node配合WebSocket做多文件下载以及进度回传

    起因 为什么做这个东西,是突然间听一后端同事说起Annie这个东西,发现这个东西下载视频挺方便的,会自动爬取网页中的视频,然后整理成列表.发现用命令执行之后是下面的样子: 心里琢磨了下,整一个界面玩一 ...

  10. python uiautomator,比 appium 更简单的 app 测试工具

    1,场景 在 app 测试的蛮荒时代,如果要进行 app 自动化测试非常麻烦.张大胖如果想做安卓自动化测试,首先必须要学 Java.因为安卓自动化测试都绕不开 google 自己研发的自动化测试框架, ...