这是我们C++的一个小小的课程设计;
因为时间比较短,支持的运算符就只有“+”,“-”,“x”,"/","%","#"(幂)。
核心部分推荐参考:
https://baike.baidu.com/item/%E5%90%8E%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F/6160580?fr=aladdin
主要是看懂中缀表达式转换为后缀表达式的规则,以及后缀表达式(逆波兰式)的计算方法,其他的就简单了。
主流程:
后缀表达式计算方法:
推荐使用链栈结构,自行百度,我这里纯粹使用了一个结构体,但是整体上也是拿这个当做栈那样用,具体的,看代码吧:
#include<iostream>
#include<stack>
#include<string>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<windows.h>
using namespace std;
typedef long long ll;
struct mix{
char Oper; //运算符
double num; //数字
int sign; //标记,存数字用num,标记为1,存运算符用Oper,标记为2
};
mix nifix[10000000]; //储存中缀表达式
int q=0; //记录nifix数组大小
string a; //读入字符串
stack<char> tool; //保存运算符
vector<mix> suffix; //保存后缀表达式
int priority(char s){ //给操作符赋予优先级
switch (s){
case '(':return 0; //这里是为了方便操作括号,实际上"()"优先级大
case '+':
case '-':
return 1;
case '*':
case '/':
case '%':
return 2;
case '#':return 3;
}
}
double calcu(double a,double b,char s){
switch (s){
case '+' : return a+b;
case '-' : return a-b;
case '*' : return a*b;
case '/' : return a/b;
case '%' : return (ll)a%(ll)b;
//一开始用的强转int,double转int存在误差,所以换成了long long
case '#' : return pow(a,b);
}
}
bool judge(string s){ //判断表达式是否合法
in