以前我们使用自己封装的栈模型探讨并实现了后缀表达式的运算,“计算机是如何基于后缀表达式计算的”,在 C++ 的 STL 中,也有一个栈模型 stack,并且使用了模版类,这样可以让我们更方便的操作数据了,下面的代码就是使用 STL 的 stack 模型实现的后缀表达式运算,我们只是把自己实现的栈模型函数替换成了 STL 的函数而已。

#include
#include

using namespace std;

// 判断是不是数组
int is_number(char ch)
{
return ch >= ‘0’ && ch <= ‘9’;
}

// 判断是不是操作数
int is_optr(char ch)
{
return ch == ‘+’ ch == ‘-‘ ch == ‘*‘ ch == ‘/‘;
}

// 计算结果
int calc(int left, int right, char optr)
{
switch (optr)
{
case ‘+’:
return left + right;
case ‘-‘:
return left - right;
case ‘*‘:
return left * right;
case ‘/‘:
return left / right;
}
return 0;
}

// 将 ch 数字转换为 int 数字
int value(char ch)
{
return ch - ‘0’;
}

int compute(const char* code)
{
stack st;

// 用于记录下标
int i = 0;
// 用于返回值返回
int ret = 0;
// 循环读取每一个字符
while (code[i])
{
// 判断是否是数字
if (is_number(code[i]))
{
// 如果是则压入栈中
st.push(value(code[i]));
//LinkStack_Push(stack, (void*)value(code[i]));
}
// 判断是不是操作数
if (is_optr(code[i]))
{
// 如果是取出第一个作为右操作数
int right = st.top();
st.pop();
//int right = (int)LinkStack_Pop(stack);
// 再取作为左操作数
int left = st.top();
st.pop();
//int left = (int)LinkStack_Pop(stack);
// 根据操作数计算两个数的结果
int result = calc(left, right, code[i]);
// 将结果压入栈中
st.push(result);
//LinkStack_Push(stack, (void*)result);
}
i++;
}

// 判断栈中是否只有一个操作数,如果只有一个那证明完成了
if (st.size() == 1/*LinkStack_Size(stack) == 1*/)
{
// 弹出最后的值给返回值的变量
ret = st.top();
st.pop();
//ret = (int)LinkStack_Pop(stack);
}
return ret;
}

int main(int argc, char* argv[])
{

printf(“8 + ( 3 - 1 ) * 5 = %d\n”, compute(“831-5*+”));
return 0;
}