代码如下:(内含注释)希望对大家有帮助
有不足之初也欢迎大家指正
#include <iostream>
#include <cmath>
#include <cstring>
#include <stack>
using namespace std ;
//判断是否为操作符
bool IsOperation(char ch){
if(ch >= '0' && ch <= '9'){
return false ;
}else{
return true ;
}
}
//栈内优先级
int InStackOperation(char operation){
switch(operation){
case '#' : return 0 ; break ;
case '(' : return 1 ; break ;
case '+' : return 3 ; break ;
case '-' : return 3 ; break ;
case '*' : return 5 ; break ;
case '/' : return 5 ; break ;
case '%' : return 5 ; break ;
case '^' : return 7 ; break ;
case ')' : return 8 ; break ;
}
}
//栈外优先级
int OutStackOperation(char operation){
switch(operation){
case '#' : return 0 ; break ;
case '(' : return 8 ; break ;
case '+' : return 2 ; break ;
case '-' : return 2 ; break ;
case '*' : return 4 ; break ;
case '/' : return 4 ; break ;
case '%' : return 4 ; break ;
case '^' : return 6 ; break ;
case ')' : return 1 ; break ;
}
}
//计算
int Calculate(int m , int n , char oper){
switch(oper){
case '+' : return m+n ; break ;
case '-' : return m-n ; break ;
case '*' : return m*n ; break ;
case '/' : return m/n ; break ;
case '%' : return m%n ; break ;
case '^' : return pow(m , n) ; break ;
}
}
int main(){
string str ;
getline(cin , str) ;//一定要以#结尾
//声明一个 字符数组
char equation[12] ;
//将字符串转换为字符数组
strcpy(equation, str.c_str());
//输入
// gets(equation) ;
//设置数字栈和运算符栈
stack<int> Num ;
stack<char> Oper ;
//开始计算流程
int begin = 0 , num1 , num2 , result;
char topOper ;
//先向操作符栈压入#
Oper.push('#') ;
char ch = equation[0] ;
while(ch != '#'){
if(!(IsOperation(ch))){
//是数字压入数字栈
Num.push((int)(ch)-48);
}else{//是操作则进行以下操作
if(ch == ')'){
topOper = Oper.top() ;
while(topOper != '('){
num1 = Num.top() ;
Num.pop();
num2 = Num.top() ;
Num.pop() ;
result = Calculate(num2 , num1 , topOper) ;
Num.push(result) ;
Oper.pop() ;
topOper = Oper.top() ;
}
}else{
topOper = Oper.top() ;//获取栈顶元素但不弹出
while(OutStackOperation(ch) < InStackOperation(topOper)){
Oper.pop() ;
topOper = Oper.top() ;
//取出数字栈中的两个数字进行运算并将结果压入栈
num1 = Num.top() ;
Num.pop() ;
num2 = Num.top() ;
Num.pop() ;
result = Calculate(num2 , num1 , topOper) ;
Num.push(result) ;
Oper.pop() ;
topOper = Oper.top() ;
} Oper.push(ch) ;
}
}begin++ ; ch = equation[begin] ;
}
//
Oper.pop() ;
topOper = Oper.top() ;
while(topOper != '#'){
num1 = Num.top() ;
Num.pop() ;
num2 = Num.top() ;
Num.pop() ;
result = Calculate(num2 , num1 , topOper) ;
Num.push(result) ;
Oper.pop() ;
topOper = Oper.top() ;
}
//输出结果
cout<<Num.top() ;
return 0 ;
}
运行结果: