上一章我们学习了stack的基本用法,接下来,我们将运用stack制作一个加减乘除计算器!
其中,要求支持加、减、乘、除四种运算符;支持括号,计算顺序与数学定义相同;考虑输入合法性;
使用STL 的 stack 容器实现计算过程。
代码如下:
#include<iostream>
#include<stack>
#include<string>
#include<cmath>
using namespace std;
//定义优先级函数
int priority(char op){
switch(op){
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
//定义计算函数
double calculate(stack<double>&s,char op){
double b=s.top();
s.pop();
double a=s.top();
s.pop();
switch(op){
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
default:
return 0;
}
}
int main(){
string line;
while(getline(cin,line)){//输入字符串
stack<double>nums;//操作数
stack<char>ops; //操作符号
string num;
int i=0;
while(i<line.size()){
if(isdigit(line[i])){//是数字读取整个数字
while(i<line.size()&&isdigit(line[i])){
num+=line[i];//字符串拼接
i++;
}
nums.push(stod(num));//将数字num压入nums操作栈中
num.clear();
i--;//循环内++了
}
else if(line[i] == '+' || line[i] == '-' ||
line[i] == '*' || line[i] =='/'){
//运算符
while(!ops.empty()&&priority(line[i])<=priority(ops.top())){
//栈顶元素优先级大于等于当前运算符,弹出栈顶元素并计算
nums.push(calculate(nums,ops.top()));
ops.pop();
}
ops.push(line[i]);//将运算符压入运算符操作栈中
}
else if(line[i]=='('){
//左括号压入操作符栈
ops.push(line[i]);
}
//右括号,弹出元素并计算,直到遇到)为止
else if(line[i]==')'){
while(!ops.empty()&&ops.top()!='('){
nums.push(calculate(nums,ops.top()));
ops.pop();
}
ops.pop();
}
i++;
}
while(!ops.empty()){
nums.push(calculate(nums,ops.top()));
ops.pop();
}
cout<<"result:"<<nums.top()<<endl;
}
return 0;
}
先码到这里,太晚了,以后有时间再解释解释(