四则运算表达式求值 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 class Node{
 10     friend Stack<T>;
 11 private:
 12     T x;
 13     Node<T> *nxt;
 14 };
 15
 16 template <typename T>
 17 class Stack{
 18 public:
 19     Stack() {head=NULL;}
 20     virtual ~Stack(){if(head) delete head;}
 21     virtual void init() {head=NULL;}
 22     virtual bool _empty() const {return head==NULL;}
 23     virtual T top() const;
 24     virtual void pop();
 25     virtual void push(const T a);
 26 private:
 27     Node<T> *head;
 28 };
 29
 30 template <typename T>
 31 T Stack<T>::top() const{
 32     return head->x;
 33 }
 34
 35 template <typename T>
 36 void Stack<T>::pop(){
 37     head=head->nxt;
 38 }
 39
 40 template <typename T>
 41 void Stack<T>::push(const T a){
 42     Node<T>  *tmp=new Node<T>();
 43     tmp->x=a;
 44     tmp->nxt=head;
 45     head=tmp;
 46 }
 47
 48 char s[maxn];
 49 Stack<char> op;
 50 Stack<double> num;
 51 void cal(){
 52     double x=num.top();num.pop();
 53     double y=num.top();num.pop();
 54     char c=op.top();op.pop();
 55     switch(c){
 56     case ‘+‘:
 57         num.push(x+y);
 58         break;
 59     case ‘-‘:
 60         num.push(y-x);
 61         break;
 62     case ‘*‘:
 63         num.push(x*y);
 64         break;
 65     case ‘/‘:
 66         num.push(y/x);
 67         break;
 68     }
 69     return ;
 70 }
 71 bool check(char c1,char c2){
 72     int a,b;
 73     double x=num.top();num.pop();
 74     if(num._empty()) {num.push(x); return 0;}
 75     else num.push(x);
 76
 77     switch (c1){
 78         case ‘+‘: a=0;break;
 79         case ‘-‘: a=0;break;
 80         case ‘*‘: a=1;break;
 81         case ‘/‘: a=1;break;
 82         case ‘(‘: a=-1;break;
 83     }
 84     switch (c2){
 85         case ‘+‘: b=0;break;
 86         case ‘-‘: b=0;break;
 87         case ‘*‘: b=1;break;
 88         case ‘/‘: b=1;break;
 89     }
 90     return a>=b;
 91 }
 92
 93 int main(){
 94     while(cin>>s){
 95         op.init();
 96         num.init();
 97         int len=strlen(s);
 98         for(int i=0;i<len;i++){
 99             if(isdigit(s[i])) {
100                 double x=atof(&s[i]);
101                 while(i<len&&(s[i+1]==‘.‘||isdigit(s[i+1]))) i++;
102                 num.push(x);
103             }
104             else{
105                 if(s[i]==‘(‘){
106                     op.push(s[i]);
107                 }else if(s[i]==‘)‘){
108                     while(!op._empty()&&op.top()!=‘(‘){
109                         cal();
110                     }
111                     op.pop();
112                 }else if(s[i]==‘=‘){
113                     while(!op._empty())
114                         cal();
115                 }else if(op._empty()){
116                     op.push(s[i]);
117                 }else {
118                     while(!op._empty()&&check(op.top(),s[i])){
119                         cal();
120                     }
121                     op.push(s[i]);
122                 }
123
124             }
125         }
126         while(!op._empty()) cal();
127         printf("%.2lf\n",num.top());
128     }
129     return 0;
130 }

时间: 2024-10-25 11:22:04

四则运算表达式求值 OpenJ_Bailian - 4132的相关文章

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

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

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

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

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

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

本份代码需要两个栈.一个是符号栈,一个是数字栈. 输入中序表达式如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]; /*运

栈的典型应用-表达式求值【转】

本文转载自:http://www.voidcn.com/blog/lub0807/article/p-1510616.html 栈的一个应用是求四则运算表达式的值,这里的表达式包含数字.加减乘除4种运算符,以及小括号. 由于输入是一个字符串,因此解决这个问题需要以下3个步骤: 1.输入字符串转化为中缀表达式: 2.中缀表达式转化为后缀表达式: 3.后缀表达式求值. 现在表达式为:9 + ( 3 - 1 )* 3 + 10 / 2 ,先看一下运行结果: 首先解释一下中缀表达式和后缀表达式的概念.所

表达式求值 - Java实现

本程序用于计算任意四则运算表达式.如 4 * ( 10 + 2 ) + 1 的结果应该为 49. 算法说明: 1. 首先定义运算符优先级.我们用一个 Map<String, Map<String, String>> 来保存优先级表.这样我们就可以通过下面的方式来计算两个运算符的优先级了: /** * 查表得到op1和op2的优先级 * @param op1 运算符1 * @param op2 运算符2 * @return ">", "<&q

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

一起talk C栗子吧(第二十一回:C语言实例--表达式求值)

各位看官们,大家好,前几回中咱们说了堆栈的原理,并且举了实际的例子进行解说,这一回咱们说的例 子是:表达式求值.表达式求值和上一回中说的括号匹配一样,都使用了堆栈的原理,大家可以从例子中 看出来,所以我们把它们放在一起.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在这里说的表达式为包含加,减,乘除的四则运算表达式.例如:1+2*3-4/5就是一个四则运 算表达式.这个表达式中,运算符在数字中间,所以我们叫它中缀表达式,这也是符合我们思维的一种表 现形式,不过,计算机就不理解中