栈的应用之一:求数学表达式求值

     今天重新学习了数据结构:栈,它的最重要的特点就是“先进后出”或者说“后进先出”,作为数据中很重要的一个内容,在算法和计算机应用中很常用到,例如:函数调用,C和C++中局部变量的内存分配、表达式求值等等。

       下面是笔者用C++中的栈容器(stack),写了下表达式的求值控制台应用程序代码,代码不一定写的是对的,如果有朋友发现错误,欢迎通过评论指正。

#include 
#include 
using namespace std;


//根据栈顶的两个操作数和操作符进行计算,并将结果压入数据栈
void calculate(stack &operater, stack &data)
{
	double leftvalue = 0;
	double rightvalue = 0;
	double result = 0;
	int op = '0';
	rightvalue = data.top();
	data.pop();
	leftvalue = data.top();
	data.pop();
	op = operater.top();
	operater.pop();
	switch (op)
	{
		case '*':result = leftvalue * rightvalue; break;
		case '/':result = leftvalue / rightvalue; break;
		case '-':result = leftvalue - rightvalue; break;
		case '+':result = leftvalue + rightvalue; break;
		default: break;
	}
	data.push(result);
}

int main()
{
	char expression[100];  //用于保存表达式字符串
	stack operater;       //操作符栈,用于保存表达式的操作符
	stack data;            //数据栈,用于保存表达式的操作数
	int index;
	//初始化
	index = 0;
	//从控制台获取表达式
	cout << "请输入合法的数学表达式:" << endl;
	cin >> expression;
	//对表达式字符串进行处理
	while ('\0' != expression[index])
	{
		switch (expression[index])
		{
			case '*':operater.push(expression[index]); index++; break;
			case '/':operater.push(expression[index]); index++; break;
			case '-':operater.push(expression[index]); index++; break;
			case '+':operater.push(expression[index]); index++; break;
			case '(':operater.push(expression[index]); index++; break;
			case ')'://如果是右括号,进行计算,直到遇到左括号
			{
				while ('(' != operater.top())
				{
					calculate(operater, data);
				}
				operater.pop();   //将左括号出栈
				if (!operater.empty() && ('*' == operater.top() || '/' == operater.top())) //将优先级高的乘除先进行计算
				{
					calculate(operater, data);
				}
				index++;
				break;
			}
			default:   //如果是数值,计算操作数的值
			{
				double value = 0.0;
				while (0 <= expression[index] - '0' && 9 >= expression[index] - '0')
				{
					value = value * 10 + (double)(expression[index] - '0');
					index++;
				}
				data.push(value);//将数值入栈

				if (!operater.empty() && ('*' == operater.top() || '/' == operater.top()))//将优先级高的乘除先进行计算
				{
					calculate(operater, data);
				}
				break;
			}
		}
	}
	//对栈中的数值求解(只剩下无括号的加减运算)
	while (!operater.empty())
	{
		calculate(operater, data);
	}
	cout << "表达式的值为:" << data.top() << endl;
	return 0;
}

 

你可能感兴趣的:(栈的应用之一:求数学表达式求值)