⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.h

📁 不带括号算术式求值另外一个版本 可以自动判断优先级 排除空格等字符影响
💻 H
字号:
#ifndef CALCULATOR_H
#define CALCULATOR_H

template<class Elem>
class Calculator
{
    private:
	    LStack<Elem> opnd;//operand stack     
     	LStack<char> optr;//operator stack        
    	static int isp(char operato);//运算符栈内优先排序                   
    	static int icp(char operato); //运算符栈外优先排序
	
        bool get2Values(double &value1,double &value2);  
	    bool doOperator(char op); 	

        void getChar(char &ch)
		{
			cin>>ch;
        	while(ch==' '||ch=='\n')
	    	cin>>ch;
		}
    	bool isOperator(char ch)
		{
			if(ch=='='||ch=='('||ch=='^'||ch=='*'||ch=='/'||ch=='%'||ch=='+'||ch=='-'||ch==')')
				return true;
			else
				return false;
		}
    public:
		void run();                            
};

template<class Elem>
int Calculator<Elem>::isp(char operato)
{
	int result;
	switch(operato)
	{
		case '=':
			result=0;
			break;
		case '(':
			result=1;
			break;
		case '^':
			result=7;
			break;
		case '*':
		case '/':
		case '%':
			result=5;
			break;
        case '+':
		case '-':
			result=3;
			break;
		case ')':
			result=8;
	}
	return result;
};

template<class Elem>
int Calculator<Elem>::icp(char operato)
{
	int result;
	switch(operato)
	{
		case '=':
			result=0;
			break;
		case '(':
			result=8;
			break;
		case '^':
			result=6;
			break;
		case '*':
		case '/':
		case '%':
			result=4;
			break;
		case '+':
		case '-':
			result=2;
			break;
		case ')':
			result=1; 
	}
	return result;
};

template<class Elem>
bool Calculator<Elem>::get2Values(double &value1,double &value2)
{
	if(opnd.empty())
	{
		cout<<"Enter error!!!"<<endl;
        return 0;
	}
	opnd.topValue(value2);
	opnd.pop();

	if(opnd.empty())
	{
		cout<<"Enter error!!!"<<endl;
	    return 0;
	}
	opnd.topValue(value1);
	opnd.pop();
    return 1;

};

template<class Elem>
bool Calculator<Elem>::doOperator(char op)
{
	Elem value1,value2;
	bool result=get2Values(value1,value2);
    if(result==true)
	{
		switch(op)
		{
			case '+':
				opnd.push(value1+value2);
				break;
			case '-':
				opnd.push(value1-value2);
				break;
			case '*':
				opnd.push(value1*value2);
				break;
			case '/':
				if(value2==0)
				{
					cout<<"The divisor can't be 0!"<<endl;
					return false;
				}
				opnd.push(value1/value2);
				break;
			case '%':
				if((long)value2==0)
				{
					cout<<"The divisor can't be 0!"<<endl;
					return false;
				}
				opnd.push((long)value1 % (long)value2);
				break;
			case '^':
				opnd.push(pow(value1,value2));
		}
		return true;
	}
	else return false;
};

template<class Elem>
void Calculator<Elem>::run()
{
	char ch,op;
	double operand;

   	opnd.clear();
	optr.clear();
	optr.push('=');

	char priorChar='=';  
	getChar(ch);

	char optrTop;
	optr.topValue(optrTop);

	if(!(optr.topValue(optrTop)))
	{
		cout<<"Enter error!!!"<<endl;
		return ;	
	}; 

	while(optrTop!='='||ch!='=')
	{
		if(isdigit(ch)||ch=='.')
		{
			cin.putback(ch);
			cin>>operand;
			opnd.push(operand);
			priorChar='0';
			getChar(ch);
		}
		else if(!isOperator(ch))
		{
			cout<<"Illegal enter!"<<endl;		
			while(cin>>ch,ch!='=');
			return;
		}
		else
		{
			if( (priorChar=='='||priorChar=='(') && (ch=='+'||ch=='-') )
				opnd.push(0);
			if(isp(optrTop)<icp(ch))
			{
				optr.push(ch);
			    priorChar=ch;
				getChar(ch);    
			}
			else if(isp(optrTop) > icp(ch))
			{
				optr.topValue(op);
				optr.pop();
				if(!doOperator(op))
					return;
			}
			else if(isp(optrTop)==icp(ch)&&ch==')')
			{
				optr.pop();
			    priorChar=')';
			    getChar(ch);
			};
		};

		if(!(optr.topValue(optrTop)))
		{
			cout<<"Enter error!!!"<<endl;
			return;	
		}; 

	}
	if(!(opnd.topValue(operand)))
	{
		cout<<"Enter error!!!"<<endl;
		return;	
	} 
	else
	{
		cout<<operand<<endl;
		return;	
	}
		
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -