1358:中缀表达式值(expr)

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 4486     通过数: 1536

【题目描述】

输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。

注意:必须用栈操作,不能直接输出表达式的值。

【输入】

一行为一个以@结束的字符串。

【输出】

如果表达式不合法,请输出“NO”,要求大写。

如果表达式合法,请输出计算结果。

【输入样例】

1+2*8-9@

【输出样例】

8

提交 统计信息 提交记录


教学备忘录:编辑
给学生提示:编辑

一本通题目1365(题解链接)加上一个判断表达式是否合法 判断情况详见注释

中缀转后缀、计算后缀表达式

#include <iostream>
#include <cstdio>
#include <stack>
#include <cmath>
#include <string>
using namespace std;stack <int> digit; // 数字栈
stack <char> symbol; // 字符栈
string str; // 保存输入的字符串
int len;int level(char ch) { // 判断字符优先级if (ch == '+' || ch == '-') return 1;if (ch == '*' || ch == '/') return 2;return 0;
}void calculation() { // 加减乘除运算int a = digit.top();digit.pop();int b = digit.top();digit.pop();char ch = symbol.top();symbol.pop();if (ch == '+') digit.push(a + b); // 运算后将结果如数字栈if (ch == '-') digit.push(b - a);if (ch == '*') digit.push(a * b);if (ch == '/') digit.push(b / a);
}void solve() {int x = 0;bool tag = false;for (int i = 0; i < len; i ++) {if (str[i] >= '0' && str[i] <= '9') { // 计算连续的数字x = x*10 + str[i]-'0';tag = true;}else { // 当前字符不为数字时if (tag) { // 如果上一个字符是数字就入栈digit.push(x);x = 0;tag = false;}if (str[i] == '(') {symbol.push(str[i]);continue;}if (str[i] == ')') {while (symbol.top() != '(') {calculation();}symbol.pop();continue;}while (!symbol.empty() && level(symbol.top()) >= level(str[i])) {calculation();}symbol.push(str[i]);}}if (tag) { // 最后的数字也要入栈digit.push(x);}while (!symbol.empty()) {calculation();}cout << digit.top() << endl;
}bool check() { // 检查表达式是否合法if (len == 1) return level(str[0]) > 0 ? false : true; // 单独一个运算符的情况for (int i = 1; i < len; i ++) { // 连续两个运算符的情况if (level(str[i]) && level(str[i-1])) return false;}int sum = 0;for (int i = 0; i < len; i ++) { // 判断括号是否匹配if (str[i] == '(') sum ++;else if (str[i] == ')') sum --;}return sum == 0;
}int main()
{cin >> str;len = str.length() - 1;if (str[0] == '-') digit.push(0);if (!check()) { // 表达式不合法cout << "NO" << endl;}else { // 表达式计算solve();}return 0;
}

信息学奥赛一本通1358 中缀表达式值(expr) ()相关推荐

  1. 信息学奥赛一本通 1358:中缀表达式值(expr)

    [题目链接] ybt 1358:中缀表达式值(expr) [题目考点] 1. 表达式求值 中缀表达式转后缀表达式 后缀表达式求值 [解题思路] 由于题目要求做中缀表达式转为后缀表达式,而后求值.那么这 ...

  2. 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)

    信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法   更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...

  3. 信息学奥赛一本通——1012:计算多项式的值

    大家好 今天给大家带来<信息学奥赛一本通--1012:计算多项式的值> 看题目: 1012:计算多项式的值 时间限制: 1000 ms         内存限制: 65536 KB 提交数 ...

  4. 信息学奥赛一本通 1356:计算(calc)

    [题目链接] ybt 1356:计算(calc) [题目考点] 1. 表达式求值 中缀表达式求值 2. 表达式树 表达式树:一棵表达式树可以表示一系列的运算. 表达式树中的结点包括运算符与数值 str ...

  5. 信息学奥赛一本通 (C++)上机练习

    信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...

  6. 【信息学奥赛一本通】题解大全

    信息学奥赛一本通网站:点击这里 [语言及算法基础篇] 第一部分:C++语言 第一章:C++语言入门 T1000    入门测试题目      点击这里 T1001    Hello,World!    ...

  7. 信息学奥赛一本通(题解目录)

    信息学奥赛一本通(题解目录) 记录了我从初学者到逐渐熟悉c++的成长之路 信息学奥赛一本通OJ 目录 信息学奥赛一本通(题解目录) 前言 一.语言及算法基础篇 基础(一) C++语言 第一章 C++语 ...

  8. 信息学奥赛一本通在线提交地址

    信息学奥赛一本通 1 C++语言入门 1.1 综合 1.1.1 P1458 地球人口承载力估计 正确: 770 提交: 1794 比率: 42.92 % 1.1.2 P1686 Hello, Worl ...

  9. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

最新文章

  1. 《新一代人工智能伦理规范》发布
  2. Public Prize
  3. 推荐 查公司信息的一个网站
  4. springmvc静态资源;mvc:default-servlet-handler后Controller失效
  5. SQL Update 语句中使用别名
  6. 组合的json文件分隔或者拆分
  7. 【Linux】10.安装和开启ftp服务
  8. Python中的网络编程之UDP
  9. python 列表索引位置,python – 在列表中查找值的第一个位置
  10. 第十章 深入理解Session与Cookie
  11. B3log 分布式社区的 Java 博客端节点系统
  12. intellij jsp 中文乱码
  13. 小米互联通信服务_时隔六年,小米NFC碰碰贴复活,碰一下自动亮灯、联网、投屏...
  14. Image Gallery
  15. 【优化分类】基于matlab粒子群算法优化支持向量机分类(多输入多分类)【含Matlab源码 1559期】
  16. habernet备份mysql_harbor 安装
  17. 彩虹查课插件 使用说明 网课查询插件 极速版
  18. 数据压缩1 | 浊音清音爆破音时域及频域特性
  19. 【PAT甲级真题整理五】1121~1155
  20. iOS开发(一)——Object-c语言基础(2、数据类型与表达式)

热门文章

  1. Struts框架之处理流程和类型转换器
  2. 单片机中c语言 右移 和左移 与CY
  3. 2020Web前端的学习之路,以及反省自身的不足之处。
  4. 随滚动条移动的图片代码
  5. 阅读真题 | 真题阅读 做题记录 二
  6. 77.Oozie的HA启用
  7. TypeScript常用基础语法学习
  8. 研究显示全球汽车区块链市场到2026年将达到16亿美元
  9. 自媒体娱乐热点素材怎么找?
  10. 随机森林预测财务报表是否舞弊