利用栈实现表达式的计算:
例如:12×(5+6×9)+7×8+(5-6×8+5/6)×12
要解决的问题主要有两个:
- × , ÷ 和 + , - 的运算顺序的处理问题
- 括号内的表达式优先运算问题
这里利用栈来解决这两个问题
首先我们设置两个栈,一个符号栈,一个数字栈
下面我们来模拟一下栈的操作过程:
首先用char数组储存字符串,然后用for循环对字符串的每一个字符进行遍历
1.如果遍历到数字则存入一个临时的栈(因为此时数字可能有多为需要进行一些转化 , 代码中会讲),
2.如果是符号的话,则进入符号栈(这里对‘)’需要进行特殊处理,当遍历到‘)’时要将符号栈清空至‘(’即优先计算括号内的表达式
3.处理加,减法时,由于栈结构是倒序,所以只要将数字栈中的数字加或减入ans中( eg. 7*8 + 5 这里直接在ans中加5就不需要考虑,加与乘 的优先级的关系 )
4.处理乘,除时,可以先计算结果,再将结果压入栈中
下面是代码:
#include<bits/stdc++.h>
using namespace std;
stack<char>sml; //储存符号的符号栈
stack<double>dgt; //储存数字的数字栈
stack<double>tmp; //临时栈,作用为将多个数字字符转换成数字
static double ans = 0.0;
void mixed() //计算表达式的函数
{
double t = 0;
if(sml.top() == '-' || sml.top() == '+') //如果栈顶为‘-’或者为‘+’,则将栈顶元素加入ans中
{
if(sml.top() == '-')ans -= dgt.top();
else if(sml.top() == '+') ans += dgt.top();
dgt.pop(); //将已经计算完的出栈
sml.pop();
}
else if(sml.top() == '*' || sml.top() == '/') //将*或/的结果入栈
{
double temp = dgt.top();
dgt.pop();
if(sml.top() == '*') t = dgt.top() * temp;
else if(sml.top() == '/') t = dgt.top() / temp;
dgt.pop();
dgt.push(t);
sml.pop();
}
}
int getnum() //转化多位数的函数
{
int index = 0 , ans1 = 0;
while(!tmp.empty())
{
int num = tmp.top();
tmp.pop();
ans1 += num * pow(10 , index++);
}
return ans1;
}
void cut() //计算括号内表达式的值
{
while(sml.top() != '(')
mixed();
sml.pop();
}
void getvalue(char *exp , int len)
{
for(int i = 0 ; i < len ; i++)
{
if(isdigit(exp[i]))
{
double num = exp[i] - '0';
tmp.push(num);
}
else
{
if(!tmp.empty())
{
double num = getnum();
dgt.push(num);
}
if(exp[i] == '(')
sml.push(exp[i]);
else if(exp[i] == ')')
{
cut();
ans += dgt.top();
dgt.pop();
dgt.push(ans);
ans = 0;
}
else
sml.push(exp[i]);
}
}
if(!tmp.empty())
{
double num = getnum();
dgt.push(num);
}
while(!sml.empty())
mixed();
cout<<dgt.top() + ans; //自己模拟运算一下有助于理解
}
int main()
{
char exp[1