之前的两篇文章将表达式求值做了个分解动作。
1、将中缀表达式转换为后缀表达式(逆波兰表达式)。
2、利用逆波兰表达式求出最终的结果。
表达式求值历来有几个比较难搞的问题:
1、带括号的优先级问题(转换为逆波兰表达式完美解决此问题)。
2、大于10的数字做表达式计算。
3、带小数点的问题。
将中缀表达式转换为后缀表达式后,括号问题就已经迎刃而解。2、3两个问题利用点小技巧就ok了。 其实表达式求值是比较基础的问题,解决该问题可以很好的理解栈这个重要的数据结构,初学者可以好好的研究这个问题。
前面都是利用c语言写的代码,本文中由于需要两个栈(char,double),所以用c++风格的代码,利用了template这个概念,可以节省很多的代码!
首先是声明和定义一个栈:
#include<iostream>
using namespace std;
const int MAXSTACKSIZE=30;
//声明栈
template<class T>
class SqStack
{
public:
SqStack();
void Pop(T * e);
void Push(T e);
T * Top();
bool isEmpty(){return top==base;}
bool isFull(){return top-base>=stacksize;}
private:
T * base;
T * top;
int stacksize;
};
//栈初始化
templat