机试-表达式求值

  1 #include <iostream>
  2 #include <stack>
  3 #include <stdio.h>
  4
  5 using namespace std;
  6
  7 char str[220];  //表达式字符串
  8 int mat[][5]=
  9 {
 10     1,0,0,0,0,
 11     1,0,0,0,0,
 12     1,0,0,0,0,
 13     1,1,1,0,0,
 14     1,1,1,0,0,
 15 };  //优先级矩阵
 16
 17 stack<int> op; //保存运算符标号,+-*/依次为1,2,3,4
 18 stack<double> in;//运算数
 19
 20 void getOp(bool &reto,int &retn,int &i)
 21 {//获得表达式的下一个元素函数,若reto为true,表示该元素为一个运算符,其编号保存在retn中;
 22     //否则,若reto为false,表示该元素为一个运算数,其值保存在引用变量retn中。
 23     //引用变量i表示遍历的字符串下标
 24     if(i==0&&op.empty()==true)
 25     {
 26         reto=true;
 27         retn=0;
 28         return;
 29     }
 30     if(str[i]==0)
 31     {
 32         reto=true;
 33         retn=0;
 34         return;
 35     }
 36     if(str[i]>=‘0‘&&str[i]<=‘9‘)
 37     {
 38         reto=false;
 39     }
 40     else
 41     {
 42         reto=true;
 43         if(str[i]==‘+‘)
 44         {
 45             retn=1;
 46         }
 47         else if(str[i]==‘-‘)
 48         {
 49             retn=2;
 50         }
 51         else if(str[i]==‘*‘)
 52         {
 53             retn=3;
 54         }
 55         else if(str[i]==‘/‘)
 56         {
 57             retn=4;
 58         }
 59         i+=2;
 60         return;
 61     }
 62     retn=0;//返回结果为数字
 63     for(;str[i]!=‘ ‘&&str[i]!=0;i++)
 64     {
 65         retn*=10;
 66         retn+=str[i]-‘0‘;
 67     }//计算该数字的数字值
 68     if(str[i]==‘ ‘)
 69         i++;
 70     return;
 71 }
 72
 73 int main()
 74 {
 75     while(gets(str))
 76     {
 77         if(str[0]==‘0‘&&str[1]==0)
 78             break;//输入只有一个0,退出
 79         bool retop;
 80         int retnum;
 81         int idx=0;
 82         while(!op.empty())
 83             op.pop();
 84         while(!in.empty())
 85             in.pop(); //清空数字栈和运算符栈
 86         while(true)
 87         {
 88             getOp(retop,retnum,idx);
 89             if(retop==false)
 90             {
 91                 in.push((double)retnum);
 92             }
 93             else
 94             {
 95                 double tmp;
 96                 if(op.empty()==true||mat[retnum][op.top()]==1)
 97                 {//若运算符栈为空或当前遍历到的运算符优先级大于栈顶运算符,
 98                     //将该运算符压入运算符堆栈
 99                     op.push(retnum);
100                 }
101                 else
102                 {
103                     while(mat[retnum][op.top()]==0)
104                     {
105                         int ret=op.top();
106                         op.pop();
107                         double b=in.top();
108                         in.pop();
109                         double a=in.top();
110                         in.pop();
111
112                         if(ret==1)
113                             tmp=a+b;
114                         else if(ret==2)
115                             tmp=a-b;
116                         else if(ret==3)
117                             tmp=a*b;
118                         else
119                             tmp=a/b;
120                         in.push(tmp);
121                     }
122                     op.push(retnum);
123                 }
124             }
125
126             if(op.size()==2&&op.top()==0)
127                 break;//若运算符栈只有两个元素,且其栈顶元素为标记运算符,则表示该表达式求值结束
128
129         }
130         printf("%.2f\n",in.top());
131     }
132     return 0;
133 }
时间: 2024-11-06 19:21:24

机试-表达式求值的相关文章

使用栈实现表达式求值

看书学了一晚上这个内容,终于实现了 分为三个步骤: 0. 检查输入是否有误(因为输入其他的非预期字符,程序就会崩溃,我就试着加了一个检查输入的函数) 1. 先将正常的中缀表达式转换为后缀表达式 2. 再进行求值 根据后缀表达式求值比较简单,因为后缀表达式已经有了优先级. 比较难懂的是将中缀表达式转换为后缀表达式,需要考虑很多情况: 1. 如果字符是 '(' ,就直接入操作符栈,因为越内层的括号优先级越高,所以不用考虑什么 2. 如果字符是 ')' ,就要结束一个左括号了,将前面的操作符出栈送入p

四则运算表达式求值 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

表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,近期又学会了一些简单的函数求值,比方,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 如果表达式能够简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 假设 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

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

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

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现.实现和原理讲解有一点不同,需要进一步进行细化. 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止. 上面的规则转换成下面的执行规则: 1.遇到操作数:直接输出(添加到后缀

序列点在C语言表达式求值中的作用

摘要: 本文开创性地分析了序列点在C语言表达式求值中的作用:序列点左边的操作数要先于其右边的操作数求值.讨论了逗号操作符,.逻辑与操作符&&.逻辑或操作符||和条件操作符?:的问号处需要序列点的原因.举例分析了序列点在表达式求值中的作用. 关键字:序列点 表达式求值 C语言 C语言作为一种主流程序设计语言,许多编程语言如Java.C++.C#都借鉴了它的语法.C语言也是一种很适当的程序设计入门的教学语言,国内大专院校的许多专业都开设了这门课程并且大多将其作为第一门程序设计语言课程,同时C语

【足迹C++primer】表达式求值

表达式求值 /** * 功能:表达式求值(0到9) * 时间:2014年6月15日08:02:31 * 作者:cutter_point */ #include<stdlib.h> #include<stack> #include<iostream> #include<string> using namespace std; stack<int> intStack; //存放数值的栈 stack<char> charStack; //存