📄 ex7_9.cpp
字号:
//【例7.9】模拟简单计算器,该计算器只认+、-、*、/ 四个运算符,输入为整数。
//表达式结束符使用=号,清空栈用'c'字符。使用'z'字符表示程序结束。
#include<iostream>
#include<cmath>
#include<cstdlib>
#include"Ex7_9.h" //链栈模板定义文件
using namespace std;
class Calculator{ //简易计算器类
Stack<int> Nstack;
Stack<char> Ostack;
public:
Calculator(void){};
void Cal(void); //计算器运算程序
void GetTwoNum(int &Num1,int &Num2);
void Compute(char Opr);
void Clear(void);
};
void Calculator::Clear(){
Nstack.MakeEmpty();
Ostack.MakeEmpty();
}
void Calculator::GetTwoNum(int &Num1,int &Num2){
Num1=Nstack.Pop();
Num2=Nstack.Pop();
}
void Calculator::Compute(char Opr){
int Num1,Num2;
if(Opr!='=') GetTwoNum(Num1,Num2);
switch(Opr){
case '+':Nstack.Push(Num2+Num1);break; //结果压栈
case '-':Nstack.Push(Num2-Num1);break;
case '*':Nstack.Push(Num2*Num1);break;
case '/':Nstack.Push(Num2/Num1);break;
case '=':cout<<Nstack.Pop()<<endl; //输出结果
}
}
void Calculator::Cal(){
bool b1=true,b2=true;
char ch1,ch2,str[50];
int k=-1;
while(b2){
cin>>ch1;
if(ch1>='0'&&ch1<='9'){
k++;
str[k]=ch1; //数字字符添入串中
}
else{
if(k>=0){
str[k+1]='\0'; //数字串生成
Nstack.Push(atoi(str)); //数字串转换为整数后压栈
k=-1;
}
switch(ch1){
case 'c':
Clear();
break;
case '+':
case '-':
while(!Ostack.IsEmpty()){
ch2=Ostack.Pop(); //不会有比'+' '-'优先级低的
Compute(ch2);
}
Ostack.Push(ch1);
break;
case '*':
case '/':
while(!Ostack.IsEmpty()&&b1){
ch2=Ostack.Pop(); //把栈顶运算符弹出
if(ch2=='*'||ch2=='/') //比较优先级
Compute(ch2); //新的优先级并不高
else{ //新的优先级高
Ostack.Push(ch2); //先把原栈中的运算符压回去
b1=false;
}
}
Ostack.Push(ch1); //再把新的运算符压栈
b1=true; //此句保证乘除从左倒右进行
break;
case '=':
while(!Ostack.IsEmpty()){
ch2=Ostack.Pop();
Compute(ch2);
}
Compute(ch1);
break;
}
if(ch1=='z') b2=false;
}
}
}
int main(){
Calculator Calcul;
cout<<"请输入四则运算式:"<<endl;
Calcul.Cal();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -