STL stack 实现后缀表达式运算

以前我们使用自己封装的栈模型探讨并实现了后缀表达式的运算,“计算机是如何基于后缀表达式计算的”,在 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;
}

 

发表评论