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

📄 stack1.cpp

📁 使用了两个栈存储数据
💻 CPP
字号:
enum Boolean{False,True};
#include<math.h>
#include"stack.h"
#include<iostream.h>
class Calculator
{
public:
	void Run();
	void Clear();  //清空s1
    void Cleartoo();   //清空s2

	int isp(char ch);
	int icp(char ch);
private:
	void Adddata(double value);
	void AddOperator(char op);
	bool Get2number(double&left,double&right);
	void DoOperator(char op);    //做运算
	Stack<double> s1;   
	Stack<char> s2;
};

void Calculator::Adddata(double value)
{
s1.push(value);
}
void Calculator::AddOperator(char op)
{
s2.push(op);
};

bool Calculator::Get2number(double&left,double&right)
{
   if(s1.IsEmpty())
   {cout<<"missing data!"<<endl;return false;}
   right=s1.pop();
   if(s1.IsEmpty())
   {cout<<"missing data!"<<endl;return false;}
   left=s1.pop();
   return true;
}

void Calculator::DoOperator(char op)
{
  double left,right;
  if(Get2number(left,right))
	  switch(op)
  {
case'+':s1.push(left+right);break;
case'-':s1.push(left-right);break;
case'*':s1.push(left*right);break;
case'/':if(right==0.0)
		{cout<<"Divide by 0!"<<endl;Clear();}
	else s1.push(left/right);break;
case'^':s1.push(pow(left,right));break; 
  }
  else Clear();

}
void Calculator::Run()         //运算
{
    char ch,y;double data;double m;
     s2.push('#');
    while (cin >> ch,ch!='=') 
	{		
         
		if (ch >= '0' && ch <= '9')  // ch为数值
		 {	
			cin.putback(ch);  // 将ch放回输入流中
			cin >> data; // 按double型方式,重新读入操作数
			Adddata(data); //  将操作数放入栈s1中
		 }
	     else if (ch == '+' || ch == '-' || ch == '*' || ch == '/'||ch=='^')  // ch是运算符
		 { 
		     y=s2.pop();
		     if(isp(y)<icp(ch)){ AddOperator(y);AddOperator(ch); }
					
			  else
			  {
				while(1)
				{  
					if(isp(y)>=icp(ch))    //比较优先数
					{
					 DoOperator(y);
			         y=s2.pop();
					}
					else 
					{
						if(y=='#')AddOperator(y);
						AddOperator(ch);
					    break;
					}  
				}
			  }
		    
		   }
		 else if(ch=='(')    //有括号的情况
		 {
		     s2.push('#');
			 while (cin >> ch) 
			 {		
                   
		           if (ch >= '0' && ch <= '9')  // ch为数值
				   {	
			             cin.putback(ch);  // 将ch放回输入流中
			             cin >> data; // 按double型方式,重新读入操作数
		                	Adddata(data); //  将操作数放入栈s1中
				   }
	               else if (ch == '+' || ch == '-' || ch == '*' || ch == '/'||ch=='^')  // ch是运算符
				   { 
		                y=s2.pop();
		                if(isp(y)<icp(ch)){ AddOperator(y);AddOperator(ch); }
					
						else
						{
							while(1)
							{  
								if(isp(y)>=icp(ch))
								{
								  DoOperator(y);
			                      y=s2.pop();
								  
								}
								else 
								{
									if(y=='#')AddOperator(y);
									AddOperator(ch);
									break;
								}  
						   }
						}
				   }
	               else if(ch==')')
				   {
					   while(1)
					   {
                          y=s2.pop();
                          if(y=='#')break;
                          else{ DoOperator(y);}
					   }
					   
					   break;
				   }
			 }
		 }
	}
 
 while(1)
 {
  y=s2.pop();
  if(y=='#')break;
  else{ DoOperator(y);}
 }
m=s1.pop();

cout<<"计算结果是    "<<m<<endl;
}
int Calculator::icp(char ch)   //栈外优先数
{
   switch(ch)
   {
    case '+':return 2;break;
    case '-':return 2;break;
	case '*':return 4;break;
	case '/':return 4;break;
	case '^':return 6;break;
	case '#':return 1;break;
    default:return 0;
   }
 
}
int Calculator::isp(char ch)     //栈内优先数
{
   switch(ch)
   {
    case '+':return 3;break;
    case '-':return 3;break;
	case '*':return 5;break;
	case '/':return 5;break;
	case '^':return 7;break;
	case '#':return 1;break;
    default:return 0;
   }
 
}

void Calculator::Clear()
{
s1.MakeEmpty();
}
void Calculator::Cleartoo()
{
s2.MakeEmpty();
}
void main()
{
  Calculator a;
  a.Clear();
  a.Cleartoo();
  cout<<"请输入您要计算的表达式,并以等号结束。运算类型可包含:加(+)、减(-)、乘(*)、除(/)、乘方(^)" <<endl;
  a.Run();
}

⌨️ 快捷键说明

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