NYoj-35-表达式求值-栈

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB

难度:4

描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。

比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)

输入
第一行输入一个整数n,共有n组测试数据(n<10)。

每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。

数据保证除数不会为0

输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.50
4.00
#include <stdio.h>
#include <string.h>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
//#include <map>
#include<queue>
#include<stack>
using namespace std;
int map[7][7]=    //算符间的优先关系,100表示不会出现的情况,1表示i>j ,-1表示i<j,0表示( )
{
	{1,1,-1,-1,-1,1,1},
	{1,1,-1,-1,-1,1,1},
	{1,1,1,1,-1,1,1},
	{1,1,1,1,-1,1,1},
	{-1,-1,-1,-1,-1,0,100},
	{1,1,1,1,100,1,1},
	{-1,-1,-1,-1,-1,100,0}
};
int Switch(char c)
{
	switch(c)
	{
	case '+':return 0;
	case '-':return 1;
	case '*':return 2;
	case '/':return 3;
	case '(':return 4;
	case ')':return 5;
	case '#':return 6;
	}
}
double calculate(double x,char c,double y)
{
	switch(c)
	{
	case '+':return x+y;
	case '-':return x-y;
	case '*':return x*y;
	case '/':return x/y;
	}
}
int judge(char c)
{
	if('0'<=c&&c<='9'||c=='.')
    return 1;

return 0;
}
char str[1005];
char optr[1005];
double opnd[1005];
int main()
{
	int t1,t2,k,len,t,temp1,temp2;;
	char ch,zz;
	double a,b;
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		gets(str);
		len=strlen(str);
		str[len-1]='#'; //处理的等于号
		t1=t2=k=0;
		optr[t1++]='#';
		ch=str[k++];
	    while(ch!='#'||optr[t1-1]!='#')
		{
	        if(judge(ch)==1)  //操作数入栈
			{
				opnd[t2++]=atof(&str[k-1]); //把字符串转换成浮点数
				while(judge(str[k])==1)
				     k++;
				ch=str[k++];
			}
			else
			{
				temp1=Switch(optr[t1-1]);    //栈顶运算符
				temp2=Switch(ch);           //当前运算符
				if(map[temp1][temp2]==-1)  //栈顶运算符优先级低
				{
                      optr[t1++]=ch;
					  ch=str[k++];
				}
				else if(map[temp1][temp2]==0) //脱括号并接受下一个字符
				{
                      t1--;
					  ch=str[k++];
				}
				else    //退栈并将运算结果保存在数据栈中
				{
                      zz=optr[--t1];
					  a=opnd[--t2];
					  b=opnd[--t2];
					  opnd[t2++]=calculate(b,zz,a);
				}
			}
		}
		printf("%.2lf\n",opnd[0]);
	}
	return 0;
}

函数说明: atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(‘\0‘)才结束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。返回值 返回转换后的浮点型数。

时间: 2024-08-07 22:24:50

NYoj-35-表达式求值-栈的相关文章

NYOJ 35 表达式求值

一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达式 第二步,然后再使用一个stack,计算后缀表达式的结果.这一步非常easy出错,考虑到浮点数的问题. */ #include <iostream> #include <string> #include <cstring> #include <cstdio>

表达式求值 (栈) 用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

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个字符,整

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

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

中缀表达式求后缀,再由后缀表达式求值

人:中缀表达式 计算机:后缀表达式 需要进行中缀转后缀,再计算.无论哪一步都需栈: 对于(3 + 4) × 5 - 6 一 中缀转后缀 涉及的栈用来存储符号如"+ - × / ( )" 思想: 遇见数字输出:遇见符号入栈 当空栈或者符号是左括号时直接入栈 ; 当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈; 当运算符是右括号时,将栈内直到第一个左括号的符号出栈,并输出非括号的符号 算法: //中缀表达式改成后缀表达式 void mid2a

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

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

表达式求值_栈

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

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

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