4132:四则运算表达式求值(栈)

总时间限制:

1000ms

内存限制: 
65536kB
描述

求一个可以带括号的小学算术四则运算表达式的值

输入
一行,一个四则运算表达式。‘*‘表示乘法,‘/‘表示除法
输出
一行,该表达式的值,保留小数点后面两位
样例输入
输入样例1:
3.4
输入样例2:
7+8.3
输入样例3:
3+4.5*(7+2)*(3)*((3+4)*(2+3.5)/(4+5))-34*(7-(2+3))
样例输出
输出样例1:
3.40
输出样例2:
15.30
输出样例3:
454.75

 思路:先把中缀表达式转化为后缀表达式,然后再求值

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 struct node {
 5     double num;
 6     char op;
 7     bool flag;
 8 };
 9 stack <node> s;
10 queue <node> q;
11 map <char,int> mp;
12 string str;
13 void change() {//把中缀表达式转化为后缀表达式
14     node temp;
15     for(int i=0; i<str.length();) {
16         if(str[i]>=‘0‘&&str[i]<=‘9‘&&i<str.length()||str[i]==‘.‘) {
17             temp.num=0;
18             temp.flag=1;
19             while(str[i]>=‘0‘&&str[i]<=‘9‘&&i<str.length()) {
20                 temp.num=temp.num*10+(str[i]-‘0‘);
21                 i++;
22             }
23             if(str[i]==‘.‘) {
24                 i++;
25                 int ii=0;
26                 while(str[i]>=‘0‘&&str[i]<=‘9‘&&i<str.length()) {
27                     ii++;
28                     temp.num+=pow(0.1,ii)*(str[i]-‘0‘);
29                     i++;
30                 }
31             }
32             q.push(temp);
33         } else {
34             if(str[i]==‘(‘||s.empty()||mp[str[i]]>mp[s.top().op]) {
35                 temp.flag=0;
36                 temp.op=str[i];
37                 s.push(temp);
38                 i++;
39             } else if(str[i]==‘)‘) {
40                 while(s.top().op!=‘(‘) {
41                     q.push(s.top());
42                     s.pop();
43                 }
44                 i++;
45                 s.pop();
46             } else {
47                 while(!s.empty()&&mp[str[i]]<=mp[s.top().op]&&s.top().op!=‘(‘) {
48                     q.push(s.top());
49                     s.pop();
50                 }
51                 temp.flag=0;
52                 temp.op=str[i];
53                 s.push(temp);
54                 i++;
55             }
56         }
57     }
58     while(!s.empty()) {
59         q.push(s.top());
60         s.pop();
61     }
62 }
63 double cal() {//对后缀表达式进行计算
64     double a1,a2;
65     node temp,now;
66     while(!q.empty()) {
67         now=q.front();
68         q.pop();
69         if(now.flag==1) {
70             s.push(now);
71         } else {
72             a2=s.top().num;
73             s.pop();
74             a1=s.top().num;
75             s.pop();
76             if(now.op==‘+‘)temp.num=a1+a2;
77             else if(now.op==‘-‘)temp.num=a1-a2;
78             else if(now.op==‘*‘)temp.num=a1*a2;
79             else if(now.op==‘/‘)temp.num=a1/a2;
80             temp.flag=1;
81             s.push(temp);
82         }
83     }
84     return s.top().num;
85 }
86 int main() {
87     mp[‘+‘]=mp[‘-‘]=1;
88     mp[‘*‘]=mp[‘/‘]=2;
89     cin>>str;
90     while(!s.empty())s.pop();
91     change();
92     printf("%.2lf\n",cal());
93     return 0;
94 }

原文地址:https://www.cnblogs.com/aiqinger/p/12682734.html

时间: 2024-09-29 02:25:00

4132:四则运算表达式求值(栈)的相关文章

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

四则运算表达式求值 OpenJ_Bailian - 4132

四则运算表达式求值 OpenJ_Bailian - 4132 题意:设计一个计算器,实现+-*/以及()的表达式运算求值. 栈的应用,这学期学数据结构,手写了栈练一下~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10010; //最大表达式长度 4 5 template <typename T> 6 class Stack; 7 8 template <typename T> 9

四则运算表达式求值の各种心碎

实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一个中缀表达式,回车表示结束. 请输入表达式: 输入一个中缀表达式 输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后 缀表达式中两相邻操作数之间利用空格隔开:如果不正确,在字符界面上输出表达式错误提示. 逆波兰表达式为: 输出逆波兰表达式 运算结果为:输出运算后的结果 测试数据

【栈的应用】四则运算表达式求值

1. 后缀表达式计算结果 (1) 规则 从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶的两个数字出栈,运算结果进栈,一直到最终获得结果. (2) 示例 后缀表达式:9 3 1 - 3 * + 10 2 / + 初始化一个空栈.此栈用来对要运算的数字进出使用: 后缀表达式中前三个都是数字,所以9.3.1依次进栈: 接下来是"-",所以将栈中的1出栈作为减数,3出栈作为背减数,并运算3-1得到2,再将2进栈: 接着是数字3进栈: 后面是"*&quo

表达式求值 (栈) 用C++实现

1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <cmath> 6 7 #include <stack> 8 9 #include <cstring> 10 11 using namespace std; 12 13 14 15 char Precede(char a, char b) { //判断运算符优先级 16 17 int i, j; 18 19 char Table[8][

表达式求值--栈

用栈的方式,将中缀转为后缀,再进行求值.另外附加括号匹配的方法 1 public class PostfixExpression { 2 3 public static int lastvalue(String str){ //后缀表达式求值,传入空格分割的字符串 4 Stack<Integer> stack = new Stack<Integer>(); 5 String[] data = str.split(" "); 6 7 for(int i = 0;i

Python解析 算数表达式求值 栈的使用

使用Python实现一种算数表达式求值的算法,模拟这种使用栈的方式,这是由E.W.Dijkstra在20世纪60年代发明的一种非常简单的算法.代码模拟仅仅表现一种编程思想,代码的逻辑并不完全: if __name__ == "__main__": cal_str = input("请输入算数表达式(e.g.(((1+2)*(3+5))+2), 只适合简单的算数表达式):") num_stack = [] symbol_stack = [] for chr in ca

从中序表达式到逆序表达式(逆波兰式)(四则运算表达式求值)

本份代码需要两个栈.一个是符号栈,一个是数字栈. 输入中序表达式如9+(3-1)*3+10/2# #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> #define max 100 char ex[max]; /*存储后序表达式*/ /*函数功能:将中序表达式转化为后序表达式*/ void trans() { char str[max]; /*表达式字符串*/ char stack[max]; /*运

hdu1237 表达式求值--栈

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24273    Accepted Submission(s): 8794 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整