后缀表达式
我们平时写的都是中缀表达式,也就是将运算符写在2个操作数中间
而后缀表达式 则是将运算符写在2个操作数后面
例如:
(a+b)*c-(a+b)/e 的后缀表达式为:ab+c*ab+e/-
计算思路
从左到右扫描输入串(string数组):
1、若当前字符为数字(操作数),则将其放入栈
2、若当前字符为运算符,则依次取出栈顶的2个数,进行对应的运算,并将运算结果放入栈
3、指针读取下一个字符,回到第1步
当遍历完数组后,栈中的唯一一个元素即为计算结果
代码实现(C++)
假设输入的字符串是一个 string类的数组
全局定义栈的相关变量和方法
const int N=100; //定义栈的最大容量
string data[N]; //使用数组表示栈
int top=-1; //指向栈顶元素下标
//判断栈是否为空
bool isEmpty(){
return top==-1 ? true : false;
}
//入栈
void Push(string ele){
if(top>=N-1){
cout<<"栈已满,无法插入"<<endl;
return;
}
data[top+1]=ele;
top++;
return;
}
//出栈
string Pop(){
if(isEmpty()==true){
cout<<"栈已空,无法出栈"<<endl;
return "!";
}
string topEle=data[top];
data[top]="null";
top--;
return topEle;
}
除此之外,我们需要一个判断当前字符是否为数字的函数(利用ASCII码判别)
bool isDigit(string v){
if(int(v[0])<=57&&int(v[0])>=48){
return true;
}else{
return false;
}
}
用于计算表达式结果的函数
//传入string数组以及数组长度
void calculate(string input[],int len){
for(int i=0;i<len;i++){
if(isDigit(input[i])==true){
Push(input[i]);
}else{
// 将取出的栈顶元素转换成int
int v2=stoi(Pop());
int v1=stoi(Pop());
if(input[i]=="+"){
Push(to_string(v1+v2));
}else if(input[i]=="-"){
Push(to_string(v1-v2));
}else if(input[i]=="*"){
Push(to_string(v1*v2));
}
else if(input[i]=="/"){
Push(to_string(v1/v2));
}else{
cout<<"ERROR"<<endl;
}
}
}
cout<<data[0]<<endl;
return;
}
参考样例:
string input[]={"6","2","/","3","-","4","2","*","+"};
计算结果为:8