NYOJ 35 表达式求值

一个模板了 哈哈.

这题由于已经包括了整形、浮点形了,以后也不须要特别处理了。

/*
这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达式
第二步,然后再使用一个stack,计算后缀表达式的结果。这一步非常easy出错,考虑到浮点数的问题。
*/
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <stack>
#include <iomanip>
using namespace std;
int cmp(char ch)     // 运算符优先级
{
	switch(ch)
	{
		case '+':
		case '-': return 1;
		case '*':
		case '/': return 2;
		default : return 0;
	}
}
void change(char *s1,char *s2)       // 中缀表达式转变后缀表达式
{
	stack <char> s;
	s.push('#');
	int i = 0,len=strlen(s1),cnt=0;
	while(i < len-1) //如今输入的是1.000 +2 /4=。假设是1.000+2/4的话须要把-1去掉
	{
	    if(s1[i]==' ')
        {
            i++;
            continue;
        }
		else if(s1[i] == '(')
		{
			s.push(s1[i++]);
		}
		else if(s1[i] == ')')
		{
			while(s.top() != '(')
			{
			    s2[cnt++]=s.top();
				s2[cnt++]= ' ';
				s.pop();
			}
			s.pop();
			i++;
		}
		else if(s1[i] == '+'||s1[i] == '-'||s1[i] == '*'||s1[i] == '/')
		{
			while(cmp(s.top()) >= cmp(s1[i]))
			{
				s2[cnt++]=s.top();
				s2[cnt++]= ' ';
				s.pop();
			}
			s.push(s1[i]);
			i++;
		}
		else
		{
			while('0' <= s1[i]&&s1[i] <= '9'||s1[i] == '.')
			{
			    s2[cnt++]=s1[i++];
			}
            s2[cnt++]= ' ';
		}
	}
	while(s.top() != '#')
	{
		s2[cnt++]=s.top();
        s2[cnt++]= ' ';
		s.pop();
	}
	s2[cnt]='\0';
}
double value(char *s2)         // 计算后缀表达式,得到其结果。
{
	stack < double> s;
	double x,y;
	int i = 0,len=strlen(s2);
	while(i < len)
	{
		if(s2[i] == ' ')
		{
			i++;
			continue;
		}
		switch(s2[i])
		{
			case '+': x = s.top(); s.pop(); x += s.top(); s.pop(); i++; break;
			case '-': x = s.top(); s.pop(); x =s.top()-x; s.pop(); i++; break;
			case '*': x = s.top(); s.pop(); x *= s.top(); s.pop(); i++; break;
			case '/': x = s.top(); s.pop(); x = s.top()/x; s.pop(); i++; break;
			default :
			{
				x = 0;
				while('0' <= s2[i]&&s2[i] <= '9')
				{
					x = x*10+s2[i] - '0';
					i++;
				}
				if(s2[i] == '.')
				{
					double k = 10.0;
					y = 0;
					i++;
					while('0' <= s2[i]&&s2[i] <= '9')
					{
						y += ((s2[i]-'0')/k);
						i++;
						k *= 10;
					}
					x += y;
				}
			}
		}
		s.push(x);
	}
	return s.top();
}
char s1[1006],s2[1006];
int main()
{
	int n;
	scanf("%d",&n);
	getchar();
	while(n--)
	{
		gets(s1);
		change(s1,s2);
		printf("%.2f\n",value(s2));
	}
	return 0;
}
/*
2
1.000 +2 / 4=
((1+2 )* 5+1) /4=
*/
时间: 2024-11-05 18:49:39

NYOJ 35 表达式求值的相关文章

NYOJ表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2/4=",程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以"

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

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

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

数据结构 表达式求值

实现表达式求值,以及表达式中括号是否匹配. 实现方法,建立两个栈,一个用来存放操作数,一个用来存放运算符.判断运算符优先级来确定什么时候出栈,利用一个数组去表示优先级 头文件代码如下: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <iostream> #include <string.h> using namespace std; template<class Type> class Stack

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著 设置运算符栈和运算数栈辅助分析运算符有限关系. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算. 在识别出运算数的同时,要将其字符序列形式转换成整数形式. 1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include

表达式求值_栈

问题 C: 表达式求值 时间限制: 3 Sec  内存限制: 128 MB提交: 1  解决: 1[提交][状态][讨论版] 题目描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧.比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10).每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每

hdu 4192(表达式求值)

题意:给一个表达式当中有一些变量,然后告诉你一些数字你可以任意排列,问能不能求出要求的结果. 思路:由于变量数目较小所以直接全排列枚举即可,然后用栈处理表达式. 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 21:50 5

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

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

表达式求值(数据结构书上栈的应用之一)

主要内容:表达式求值,提交nyoj通过... 思路:主要就是一个开两个栈,然后一个操作符栈,一个操作数栈.. 我的代码如下(比较简洁): /***** Author Gery ******/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> #include<cmath&