蓝桥杯练习系统 表达式计算

题目:

问题描述

  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入格式

  输入一行,包含一个表达式。

输出格式

  输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

上代码:

 1 #include<stack>
 2 #include<iostream>
 3 #include<string>
 4 using namespace std;
 5 int mat[5][6] = {//+,-,*,/,(
 6     1, 1, 0, 0, 0, 1,
 7     1, 1, 0, 0, 0, 1,
 8     1, 1, 1, 1, 0, 1,
 9     1, 1, 1, 1, 0, 1,
10     0, 0, 0, 0, 0, 1
11 };
12 string str;
13 stack<int> nu;
14 stack<int> op;
15 int len;
16 void get(bool &flag, int &retn, int &i){//返回字符串的第i个数据
17     char tmp;
18     tmp = str.at(i);
19     if (tmp <= ‘9‘&&tmp >= ‘0‘){//是数字
20         int x = 0;
21         while (i<len&&str.at(i) <= ‘9‘&&str.at(i) >= ‘0‘){
22             x = x * 10 + str.at(i) - 48;
23             i++;
24         }
25         i--;
26         flag = false;
27         retn = x;
28     }
29     else{//是运算符
30         flag = true;
31         if (tmp == ‘+‘) retn = 0;
32         else if (tmp == ‘-‘) retn = 1;
33         else if (tmp == ‘*‘) retn = 2;
34         else if (tmp == ‘/‘) retn = 3;
35         else if (tmp == ‘(‘) retn = 4;
36         else retn = 5;
37     }
38 }
39 int main(){
40     cin >> str;
41     len = str.size();
42     int idx = 0;
43     bool isstring;
44     int retnum;
45     while (idx<len){
46         get(isstring, retnum, idx);
47         if (isstring == false){//是数字
48             nu.push(retnum);
49         }
50         else{//是操作符
51             if (op.empty() || mat[op.top()][retnum] == 0){//符号入栈
52                 op.push(retnum);
53             }
54             else{//需要进行出栈
55                 while (!op.empty() && mat[op.top()][retnum] == 1){//如果符号栈非空并且 需要进行出栈操作
56                     int tmp = op.top();//栈顶符号
57                     op.pop();
58                     if (tmp == 4) break;//如果栈顶是左括号,直接左括号出栈。
59                     //如果栈顶不是左括号,取出数字栈的最上面两个 和运算符运算。
60                     int a = nu.top();
61                     nu.pop();
62                     int b = nu.top();
63                     nu.pop();
64                     if (tmp == 0) nu.push(a + b);
65                     else if (tmp == 1) nu.push(b-a);
66                     else if (tmp == 2) nu.push(a*b);
67                     else if (tmp == 3) nu.push(b / a);
68                 }
69                 if (retnum != 5) op.push(retnum);
70             }
71         }
72         idx++;
73     }
74     while (!op.empty()){//最后依次取出符号栈来进行运算
75         int tmp = op.top();//栈顶符号
76         op.pop();
77         int a = nu.top();
78         nu.pop();
79         int b = nu.top();
80         nu.pop();
81         if (tmp == 0) nu.push(a + b);
82         else if (tmp == 1) nu.push(b-a);
83         else if (tmp == 2) nu.push(a*b);
84         else if (tmp == 3) nu.push(b/a);
85     }
86     cout << nu.top() << endl;
87 }
时间: 2024-10-20 15:52:32

蓝桥杯练习系统 表达式计算的相关文章

蓝桥杯练习系统— 算法训练 Beaver&#39;s Calculator

问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样的科学问题中. 为了测试它,聪明的海狸邀请了n位科学家,编号从1到n.第i位科学家给这个计算器带来了 ki个计算题.第i个科学家带来的问题编号1到n,并且它们必须按照编号一个一个计算,因为对于每个问题的计算都必须依赖前一个问题的计算结果. 每个教授的每个问题都用一个数 ai,?j? 来描述,i(1≤i≤n)是

蓝桥杯练习系统——基础练习 十六进制转十进制

0.下载安装Opencv,当前版本为249. 1.下载Python,当前OPencv版本为249,不过其支持的最新版本的Python为2.7,所以可以下载276版本. 2.下载numpy,开始我使用了1.6,没有通过,错误如图.下载了最新的1.8.1版本. 3.将Opencv安装目录下opencv\build\python\2.7\x86中的cv2.pyd复制到python安装目录Lib\site-packages下. 4.找到opencv源文件内的draw.py运行. 蓝桥杯练习系统--基础练

蓝桥杯练习系统题解

转于:http://www.cnblogs.com/cshhr/p/3550014.html 蓝桥杯官网练习系统题解(非VIP) BEGIN-4(Fibonacci数列) 有递推公式,大家都知道用递推公式求,仅仅要记得在递推的时候同一时候取模求好 这里给一份另类代码,用矩阵高速幂求,事实上还有循环节 /* (1 1) * (Fn-1) = ( Fn )//矩阵相乘,将就着看吧 (1 0) (Fn-2) (Fn-1) (1 1) * (1 1) * (Fn-2) = ( Fn ) (1 0) (1

蓝桥杯练习系统 C++ CH08 01

题目: 问题描述 已知一个有理数类Zrf_Ratio,实现如下的操作符重载形式: friend std::ostream& operator<<(std::ostream&, const zrf_Ratio&);//输出最简分数 friend std::istream& operator>>(std::istream&, zrf_Ratio&); friend bool operator==(const zrf_Ratio&,

蓝桥杯练习系统历届试题 横向打印二叉树

问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放入那个位置. 比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白. ...|-1210-|...|-8-|.......|...|-7.......|-5-|...........|-4 本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树. 输入格式 输入数据为一行空格分开的

蓝桥杯练习系统算法提高 求最大值

问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负. 输入格式 输入的第一行为n,数对的个数 以下n行每行两个整数 ai bi 输出格式 输出你选定的数对的ai+bi之和 样例输入 5-403 -625-847 901-624 -708-293 413886 709 样例输出 1715 数据规模和约定 1<=n<=100 -1000<=ai,bi<=1000 思路: 讲道理好嘛~~自己

蓝桥杯练习系统--入门训练+基础练习

入门训练 <1>Fibonacci数列 问题描述  Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式  输入包含一个整数n. 输出格式  输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取

蓝桥杯-逆波兰表达式

逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便. 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序. 相反,如果使用逆波兰表达式(前缀表达式)表示,上面的算式则表示为: -+ 3 * 5 + 2 6 1 不再需要括号,机器可以用递归的方法很方便地求解. 为了简便,我们假设: 1. 只有 + - * 三种运算符 2. 每个运算数都是一个小于10的非负整数 下面的程序对一个逆波兰表示串进行求值. 其返回值为一个结构:其中第一

蓝桥杯练习系统—基础练习 完美的代价

第一部分:题目 问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的.现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串. 交换的定义是:交换两个相邻的字符 例如mamad 第一次交换 ad : mamda 第二次交换 md : madma 第三次交换 ma : madam (回文!完美!) 输入格式 第一行是一个整数N,表示接下来的字符串的长度(N <= 8000) 第二行是一个字符串,长度为N.只包含小写字母 输