今天重新学习了数据结构:栈,它的最重要的特点就是“先进后出”或者说“后进先出”,作为数据中很重要的一个内容,在算法和计算机应用中很常用到,例如:函数调用,C和C++中局部变量的内存分配、表达式求值等等。
下面是笔者用C++中的栈容器(stack),写了下表达式的求值控制台应用程序代码,代码不一定写的是对的,如果有朋友发现错误,欢迎通过评论指正。
#include <iostream>
#include <stack>
using namespace std;
//根据栈顶的两个操作数和操作符进行计算,并将结果压入数据栈
void calculate(stack<int> &operater, stack<double> &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<int> operater; //操作符栈,用于保存表达式的操作符
stack<double> 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;
}