📄 stack1.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 + -