一、问题概述:
人们经常书写的数学表达式属于中缀表达式,今天要解决的是,后缀表达式的求解问题。
如下图分别为举例的中缀表达式和后缀表达式:
二、解决思路
我们用栈存储后缀表达式中的数据部分,当遇到操作符时就取出栈中的栈顶两个元素,检测操作符的类型,并进行相应的计算(这里要注意的是,对于除法运算,栈顶的两个元素的位置得区分)。
如下所示:
三、实现代码
//Expression.h
#pragma once
#include<stack>
#include<assert.h>
enum Type
{
OP_SYMBOL,
OP_NUM,
ADD,
SUB,
MUL,
DIV
};
struct Cell
{
Type _type;
int _value;
};
void FunTest()
{
Cell RPN[] = {
{OP_NUM,12},
{OP_NUM,3},
{OP_NUM,4},
{OP_SYMBOL,ADD},
{OP_SYMBOL,MUL},
{OP_NUM,6},
{OP_SYMBOL,SUB},
{OP_NUM,8},
{OP_NUM,2},
{OP_SYMBOL,DIV},
{OP_SYMBOL,ADD}
};
stack<int> s;
for(size_t i = 0; i < sizeof(RPN)/sizeof(RPN[0]);++i)
{
if(RPN[i]._type == OP_NUM)
{
s.push(RPN[i]._value);
}
else if(RPN[i]._type == OP_SYMBOL)
{
int second = s.top();
s.pop();
int first = s.top();
s.pop();
switch(RPN[i]._value)
{
case ADD:
s.push(first+second);
break;
case SUB:
s.push(first-second);
break;
case MUL:
s.push(first*second);
break;
case DIV:
s.push(first/second);
break;
default:
assert(false);
}
}
else
{
assert(false);
}
}
cout<<s.top()<<endl;
}
//Expression.cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include"Expression.h"
int main()
{
FunTest();
return 0;
}
后缀表达式就说到这里喽,有需要改进得地方,欢迎提出宝贵意见哦。