表达式求值

看了大神的代码后

我们先看个例子:


1.比较运算符号的优先级  *||/>+||- , * > -,先算 7*2; 将结果保存在 7的位置;
2.最后进行减号。
题目:
  描述

计算表达式的值。

输入

输入文件第一行为测试用例的个数N(1<=N<=100),接下N行,每行为一个表达式,表达式除了数值外,只包含“+”、“-”、 “*”、“/”,分别表示加减乘除运算。对除法运算,结果假定不出现小数。同时也可以假定表达式中间及最后结果不大于9999999

输出

对每一个表达式,用一行输出其值。

样例输入

4
2+5
4+2*3-10/5
3*7-2
1+2+3+4
样例输出

7
8
19
10
ACcode:

#include <iostream>
#include <string>
using namespace std;
//构造两个栈,一个数字栈,另一个符号栈
typedef struct 
{
	double *data;
	int top;
}Stack1;
typedef struct 
{
	char *c;
	int top;
}Stack2;
//初始化
void Init_1(Stack1 &S,int len)
{
	S.data=new double [len+1];
	S.top=0;
}
void Init_2(Stack2 &S,int len)
{
	S.c=new char[len+1];
	S.top=0;
}
//入栈
void push_1(Stack1 &S,int n)
{
	S.data[S.top++]=n;
}
void push_2(Stack2 &S,char ch)
{
	S.c[S.top++]=ch;
}
//运算符号比较
int compare(char c1,char c2)
{
	//有4种情况 
	// 1.  c1为+.-||c2为+.-
	// 2.  c1为+、-||c2为 *./
	// 3.  c1为 * ./ || c2 为 +.-
	// 4.  c1为 * ,/ || c2 为* , /
	//其中 1,3,4 是一次按顺序计算,2要先计算后面的
	if((c1=='+'||c1=='-')&&(c2=='*'||c2=='/'))
		return 1;
	else
		return 0;
}
double jisuan(double c1,double c2,char c)
{
	if(c=='+')
		return c1+c2;
	else if(c=='-')
		return c1-c2;
	else if(c=='*')
		return c1*c2;
	else if(c=='/')
		return c1/c2;
}
void qiuzhi(Stack1 S1,Stack2 S2)
{
	int i,j=0;
	double e;
	for(i=0;i<S2.top-1;i++)
	{
		
		if(compare(S2.c[i],S2.c[i+1]))//判断优先级
		{
			//i+1的优先级大于i的优先级
            e=jisuan(S1.data[j+1],S1.data[j+2],S2.c[i+1]);//计算结果
			S1.data[j+2]=e;  //所得之放入j+2中    
			S1.data[j+1]=S1.data[j];//将下面的数字往上移一位
			S2.c[i+1]=S2.c[i];//符号也往上移一位
			j++;
		}
		else
		{
			e=jisuan(S1.data[j],S1.data[j+1],S2.c[i]);
			S1.data[j+1]=e;
			j++;
		}
	}
    cout<<jisuan(S1.data[j],S1.data[j+1],S2.c[i])<<endl;
}
int main()
{
	Stack1 S1;
	Stack2 S2;
	int n,i,k,len;
	string str;
//	freopen("1.txt","r",stdin);
	cin>>n;
	while(n--)
	{
		cin>>str;
		len=str.length();
		Init_1(S1,len);
		Init_2(S2,len);
		int t=0;  k=0;
		//将数字放入数字栈,将运算符放入符号栈
		for(i=0;i<len;i++)
		{
			if(str[i]>='0' && str[i]<='9')
				k=k*10+str[i]-'0';
			else
			{
				push_1(S1,k);
				k=0;
				if(str[i]=='+'||str[i]=='-'||str[i]=='/'||str[i]=='*')
					push_2(S2,str[i]);
			} 
			if(i==len-1)
				push_1(S1,k);
		}
		qiuzhi(S1,S2);
	}
	
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值