首先来看看我们需要解决的问题
对于一个算术表达式,我们用堆栈的方式解决它。
我们实现一个简单的 12 / 3 = 4;
源码:
#include <iostream>
using namespace std;
#include <stack> //调用 栈 的库
#include <assert.h>
enum Type //枚举出现的情况
{
OP_SYMBOL, //符号
OP_NUM, //或者push的数字
ADD,
SUB,
MUL,
DIV,
};
struct Cell //cell的意思是单元 每个里面存储枚举类型,和所要push的数字。
{
Type _type;
int _value;
};
int CountPRN(Cell* rpn, size_t n) //这里就是实现的主函数,注意这里传的是Cell* 和 接受的个数。
{
assert(rpn);
stack<int> s; //实例化一个对象
for(size_t i = 0 ;i < n ; ++i)
{
if(rpn[i]._type == OP_NUM) // rpn是一个数组,它又是Cell* 里面的,点一个type,接受测试里面所写的类型
{
s.push(rpn[i]._value); //是数字的话,给栈里面push一个所传的值。
}
else if(rpn[i]._type == OP_SYMBOL)
{
int right = s.top(); //因为接收到了符号,那么在里面取两值。
s.pop();
int left = s.top();
s.pop();
switch(rpn[i]._value) //让左值与右值进行计算,计算的值又push进去
{
case ADD:
s.push(left + right);
break;
case SUB:
s.push(left - right);
break;
case MUL:
s.push(left * right);
break;
case DIV:
s.push(left / right);
break;
default:
assert(false);
}
}
}
return s.top(); //返回栈顶的值。
}
void TestRPN()
{
Cell RPN[] = {
{OP_NUM,12},
{OP_NUM,3},
{OP_SYMBOL,DIV}
};
cout<<CountPRN(RPN,sizeof(RPN)/sizeof(RPN[0]));
}
int main ()
{
TestRPN();
return 0;
}