#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<sstream>
using namespace std;
#define L 101
int topS=0; //指针指向空白处 // --再运算
int topN=0;
char sym[L]; //符号栈
int num[L]; //数字栈
char b[L];
int len;
int i=0;
int x; //用来临时存储数字
int t1,t2; //运算时颠倒顺序
//声明func,防止先后顺序
void pushS(char),pushN(int),popS();
int popN();
void pushS(char n){
sym[topS++]= n;
}
void pushN(int n){
num[topN++]= n;
}
void popS(){
//仿map(映射)
switch(sym[--topS]){
case '+': pushN(popN()+popN());break;
case '-': t1=popN();t2=popN();pushN(t2-t1);break;
case '*': pushN(popN()*popN());break;
case '/': t1=popN();t2=popN();pushN(t2/t1);break;
case '^': t1=popN();t2=popN();pushN(int(pow(t2,t1)));break;
}
}
int popN(){
return num[--topN];
}
bool can(){
if((b[i] == '+' || b[i] == '-') && (sym[topS-1] !='(')) return 1; //1级无0级可算
if((b[i] == '*' || b[i] == '/') && (sym[topS-1] !='(' && sym[topS-1] !='+' && sym[topS-1] !='-')) return 1; //2级无1级0级可算
if((b[i] == '^') && (sym[topS-1] !='(' && sym[topS-1] !='+' && sym[topS-1] !='-' && sym[topS-1] !='*' && sym[topS-1] !='/')) return 1; //3级无2级1级0级可算
//也可用取补集的思想来判断
return 0;
}
int main()
{
//输入数据
cin >> b;
len = strlen(b);
b[len] = ')'; //结尾解封
pushS('('); //开头封印
//开始运算
while(i<len){
//1.左括号
while(b[i]=='('){
pushS(b[i]);
i++; //没操作1次 -> 推动1次
}
//2.数字(左括号出现在数字前)!!!!
x=0;
while(int(b[i]) >= int('0') && int(b[i]) <= int('9')){
x = x*10 + int(b[i]-'0'); //取char数字!!!!
i++;
}
pushN(x);
//3.运算符 + 右括号
do{
if(b[i]==')'){ //全消除 => 直到有左括号
while(sym[topS-1]!='('){ //topS默认指向空白的
popS();
}
topS--; //消除"("号
}else{
//前面能算先算
//算完再存
while(can()) popS();
pushS(b[i]);
}
i++;
}while(i<len && b[i-1]==')'); //防止内部超界,外部不知
}
cout << num[0];
return 0;
}
//1+(3+2)*(7^2+6*9)/2
//cout << "输入:"
练习4 - 计算(calc)
最新推荐文章于 2022-05-26 18:13:15 发布