水平有限,花了两个小时实现了用栈进行基本的四则运算,只针对整数的运算。(即使两个整数相除也将得到整数)
思路:将输入的中缀表达式用栈转化为后缀表达式,再根据后缀表达式用栈实现运算。
中缀表达式:运算符位于运算数中间的表达式。如1+2,3*4
后缀表达式:运算符位于运算数后的表达式。如12+,34*
有中缀,有后缀,当然也有前缀。将中缀转换成前缀表达式然后进行计算与转换成后缀其实完全类似,这里只介绍后者。
(1)
先介绍用栈将中缀表达式转换成后缀表达式
1.建立两个栈 s1, s2.
2.遍历表达式字符串
3.若遇到数字,则直接压入s1
4.若遇到运算符(包括括号)
4(1)若s2为空,或s2栈顶为’(‘,则直接压入s2
4(2)若运算符比s2栈顶的运算符优先级高,则直接压入s2
4(3)若(1)(2)均不成立,则推出s2栈顶元素,将s2的栈顶元素压入s1,再回去进行(1)(2)两步骤
5.若遇到’(‘,则直接压入s2
6.若遇到‘)’,则将s2的元素推出并压入s1,直到s2栈顶出现’(‘,
(2)
根据后缀表达式计算
1.建立一个栈s
2.遍历后缀表达式字符串
3.遇到数字,则直接压入s
4.遇到运算符,则推出s的最上面两个数,根据运算符对两个数进行加减乘除,并将运算结果压回s
5.遍历结束后,最终结果就在栈s顶。
下面是c++代码的具体实现。该代码只是笔者为了练习和理解栈的概念所编写,只是最简单的实现,不包括检错报错和浮点数运算,水平有限,不要用于除研究以外的其他用途。
#include <stack>
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int compareOperatorPriority(char op1,char op2);
string getSuffixExpression(string str);
int calculate(string str);
bool isDigit(char c);
bool isOperator(char c);
int main(int argc, char const *argv[])
{
/* code */