题目描述
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
输入描述: 输入一个算术表达式 如 3+2*{1+2*[-4/(8-6)+7]}
输出描述: 得到计算结果 输出 25
思路
- 用两个栈分别存数字和运算符,根据符号优先级别判断栈内是否先计算。
- 数字依次压入数字栈,符号栈压入之前先判断是否为括号;
如果是括号:左括号压入,右括号则进行栈顶运算符的运算直到遇到左括号。如果是运算符,则判断优先级是否比栈顶符号高,如果是则压入,不是则先计算栈顶运算符号的运算,直到当前运算符优先级高于栈顶运算符; - 计算过程为数字栈弹出两个数,符号栈弹出一个运算符进行运算。
需注意的问题
- 数字有可能带正负号, 需判断符号什么时候是运算符什么时候表示正负。
- 对于符号:先判断左右括号,这样可以排除左右括号。则数字后面必是运算符号(因为不考虑左右括号了),
- 刚开始时,遇到第一个数字之前的运算符号一定是表示正负号,数字之后才是运算符号,所以可以在数字赋值后面加个是否为要执行运算的运算符赋值。
代码如下:
#include <unordered_map>
#include <stack>
#include <iostream>
using namespace std;
void cal(stack<int> &num, stack<char> &opt) {
//计算过程
int b = num.top();
num.pop();
int a = num.top();
num.pop();
switch (opt.top())
{
case '+': {
num.push(a + b); break; }//
case '-':