栈实现四则运算

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
int n;         //  +     -     *     /     (     )     =  优先级 
char prior[7][7]={'>',  '>',  '<',  '<',  '<',  '>',  '>',
				  '>',  '>',  '<',  '<',  '<',  '>',  '>',
				  '>',  '>',  '>',  '>',  '<',  '>',  '>',
				  '>',  '>',  '>',  '>',  '<',  '>',  '>',
				  '<',  '<',  '<',  '<',  '<',  '=',    0 ,
				  '>',  '>',  '>',  '>',   0,   '>',  '>',
				  '<',  '<',  '<',  '<',  '<',   0,     0};
bool isnum(char ch)
{//判断是操作数还是操作符 
	if(ch!='='&&ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='('&&ch!=')')
	return true;
	else
	return false;
}
int table(char ch)
{
	switch(ch)
	{
		case '+':return 0;
		case '-':return 1;
		case '*':return 2;
		case '/':return 3;
		case '(':return 4;
		case ')':return 5;
		case '=':return 6;
	}
}
double operate(double a,double b,char op)
{
	switch(op)
	{
		case '+':return a+b;
		case '-':return a-b;
		case '*':return a*b;
		case '/':return a/b;
	}	
}
int main()
{
	scanf("%d",&n);
	getchar();
	while(n--)
	{
		char ch;
		double integer=0;//整数 
		double decimal=0;//小数 
		bool flag=0;
		double num=0;
		double times=10;
		stack<char>opera;//operator操作符 
		stack<double>rand;//operand操作数
		opera.push('=');
		ch=getchar(); 
		while(ch!='='||opera.top()!='=')
		{
			if(isnum(ch))
			{
				if(ch=='.')
				{
					flag=1;
					ch=getchar();
				}
				num=ch-'0';
				if(!flag)
				{
					integer=integer*10+num;
				}
				else
				{
					decimal=decimal+num/times;
					times=times*10; 
				}
				ch=getchar();
				if(!isnum(ch))
				{
					flag=0;
					times=10;
					decimal=decimal+integer;
					rand.push(decimal);
					integer=0;
					decimal=0;	
				}
			}
			else
			{
				int a=table(ch);
				int b=table(opera.top());
				switch(prior[b][a])
				{
					case '<'://新操作符如果优先级高于栈顶的操作符,新操作符入栈; 
						opera.push(ch);
						ch=getchar();
						break;
					case '='://新操作符如果优先级等于栈顶的操作符,栈顶操作符出栈;
						opera.pop();
						ch=getchar();
						break;					
					case '>'://新操作符优先级如果低于栈顶操作符,操作符栈顶出栈,两次操作数出栈,计算出的数字进入操作数栈 
						char opera1=opera.top();opera.pop();
						double num1=rand.top();rand.pop();
						double num2=rand.top();rand.pop();
						rand.push(operate(num2,num1,opera1));
						break;
						
				}
			}
		}
		printf("%.2lf\n",rand.top());
		getchar();
	}
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值