要求
计算器接受四则运算表达式为输入(如下所示)。如果表达式语法正确,则输出计算结果,否则报错,指出错误位置及原因。
1) 每个语句需要以“;”结束;
2) 涉及的操作符只要求加减乘除;支持括号;
3) 操作数为整数或浮点数;
4) 变量不需要先声明,可直接赋值,它的类型由右边表达式的类型决定;每个变量在使用之前必须要已经有赋值;
5) 变量名可以是由数字和字母组成,但首字符必须是字母;
6) 输出语句使用print()函数,输出并换行;
7) print()函数不仅可以输出变量,还可以直接输出表达式的值,例如print(1+2);
8) 使用C/C++、Java编写,除了标准库外,不得使用任何第三方库。
9) 尽量考虑周全,顾及corner cases。例如除零;
思路说明
一、中缀表达式求值
1、创建“MyStack.h”文件,构建了栈的结构。
#pragma once
#include <iostream>
#define MAX 100
using namespace std;
template <class T>
class MyStack
{
public:
T data[MAX];
int top;
public:
void init(); // 初始化栈
bool empty(); // 判断栈是否为空
T getTop(); // 读取栈顶元素(不出栈)
void push(T x); // 进栈
T pop(); // 出栈
};
template<class T>
void MyStack<T>::init()
{
this->top = 0;
}
template<class T>
bool MyStack<T>::empty()
{
return this->top == 0 ? true : false;
}
template<class T>
T MyStack<T>::getTop()
{
if (empty())
{
cout << "栈为空!\n";
exit(1);
}
return this->data[this->top - 1];
}
template<class T>
void MyStack<T>::push(T x)
{
if (this->top == MAX)
{
cout << "栈已满!\n";
exit(1);
}
this->data[this->top] = x;
this->top++;
}
template<class T>
T MyStack<T>::pop()
{
if (this->empty())
{
cout << "栈为空! \n";
exit(1);
}
T e = this->data[this->top - 1];
this->top--;
return e;
}
2、创建了“InfixToPostfix.h”文件。里面有五个函数,共同完成对中缀表达式的求值
bool isoperator(char op); // 判断是否为运算符
int priority(char op); // 求运算符优先级
double postfix(string pre, map<string, int> mymap, int *i); // 把中缀表达式转换为后缀表达式