信息学奥赛一本通1358 中缀表达式值(expr) ()
1358:中缀表达式值(expr)时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】输入一个中缀表达式(由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) ()相关推荐
- 信息学奥赛一本通 1358:中缀表达式值(expr)
[题目链接] ybt 1358:中缀表达式值(expr) [题目考点] 1. 表达式求值 中缀表达式转后缀表达式 后缀表达式求值 [解题思路] 由于题目要求做中缀表达式转为后缀表达式,而后求值.那么这 ...
- 信息学奥赛一本通(基础算法与数据结构-题解汇总目录)
信息学奥赛一本通(C++版)在线评测系统 基础(二)基础算法 更新中...... 第一章高精度计算 1307[例1.3]高精度乘法 1308[例1.5]高精除 1309[例1.6]回文数(Noip ...
- 信息学奥赛一本通——1012:计算多项式的值
大家好 今天给大家带来<信息学奥赛一本通--1012:计算多项式的值> 看题目: 1012:计算多项式的值 时间限制: 1000 ms 内存限制: 65536 KB 提交数 ...
- 信息学奥赛一本通 1356:计算(calc)
[题目链接] ybt 1356:计算(calc) [题目考点] 1. 表达式求值 中缀表达式求值 2. 表达式树 表达式树:一棵表达式树可以表示一系列的运算. 表达式树中的结点包括运算符与数值 str ...
- 信息学奥赛一本通 (C++)上机练习
信息学奥赛一本通(C++)上机练习 此书为娃儿的第一本刷题书.娃儿现在四年级 ,希望他能坚持下来.特开贴加油 luogu: disangan223 第一部分 C++语言 第一章 C++语言入门 T10 ...
- 【信息学奥赛一本通】题解大全
信息学奥赛一本通网站:点击这里 [语言及算法基础篇] 第一部分:C++语言 第一章:C++语言入门 T1000 入门测试题目 点击这里 T1001 Hello,World! ...
- 信息学奥赛一本通(题解目录)
信息学奥赛一本通(题解目录) 记录了我从初学者到逐渐熟悉c++的成长之路 信息学奥赛一本通OJ 目录 信息学奥赛一本通(题解目录) 前言 一.语言及算法基础篇 基础(一) C++语言 第一章 C++语 ...
- 信息学奥赛一本通在线提交地址
信息学奥赛一本通 1 C++语言入门 1.1 综合 1.1.1 P1458 地球人口承载力估计 正确: 770 提交: 1794 比率: 42.92 % 1.1.2 P1686 Hello, Worl ...
- 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)
[题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...
最新文章
- 《新一代人工智能伦理规范》发布
- Public Prize
- 推荐 查公司信息的一个网站
- springmvc静态资源;mvc:default-servlet-handler后Controller失效
- SQL Update 语句中使用别名
- 组合的json文件分隔或者拆分
- 【Linux】10.安装和开启ftp服务
- Python中的网络编程之UDP
- python 列表索引位置,python – 在列表中查找值的第一个位置
- 第十章 深入理解Session与Cookie
- B3log 分布式社区的 Java 博客端节点系统
- intellij jsp 中文乱码
- 小米互联通信服务_时隔六年,小米NFC碰碰贴复活,碰一下自动亮灯、联网、投屏...
- Image Gallery
- 【优化分类】基于matlab粒子群算法优化支持向量机分类(多输入多分类)【含Matlab源码 1559期】
- habernet备份mysql_harbor 安装
- 彩虹查课插件 使用说明 网课查询插件 极速版
- 数据压缩1 | 浊音清音爆破音时域及频域特性
- 【PAT甲级真题整理五】1121~1155
- iOS开发(一)——Object-c语言基础(2、数据类型与表达式)