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