📄 7-3-2.cpp
字号:
#include <iostream.h>
#include <stdlib.h>
#define STACKSIZE 10
class Stack {
private:
long buffer[STACKSIZE];
long *sp;
public:
Stack() { sp = buffer; }
~Stack() { };
void Empty() { sp = buffer; }
bool IsEmpty() {
if(sp == buffer) return true;
else return false;
}
void Push(long data) {
if(sp >= buffer+STACKSIZE)
cerr << "Stack overflow !" << endl;
else *sp ++ = data;
}
long Pop() {
if(sp <= buffer) {
cerr << "Stack is Empty!" << endl;
return 0;
}
else return *--sp;
}
};
class Calculator {
private:
Stack Nstack; // 处理操作数
Stack Ostack; // 处理运算符
public:
Calculator(void) { };
void Cal(void); //计算器运算程序
void GetTwoNum(int &Num1,int &Num2);
void Compute(char Opr);
void Clear(void);
};
void Calculator::Clear() {
Nstack.Empty();
Ostack.Empty();
}
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(void) {
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; //将b1复原
case '=':
while(!Ostack.IsEmpty()) {
ch2=Ostack.Pop();
Compute(ch2);
}
Compute(ch1); break;
}
if(ch1 == 'z') b2=false;
}
}
}
main()
{ Calculator MyCal;
MyCal.Cal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -