1.逆波兰表达式?
在我们的普遍认知中,计算的优先级总是和()相关,形如(1+2)*(3+4)这样的式子,我们看起来十分的清晰明了,但对计算机来说,它会进行很多次的判断来确定一个运算的优先级。于是在很久很久之前就有一个人发现,如果我们将上述算式写成形如1 2 + 3 4 + *的形式,计算机判断起来会显得格外的快,效率也会更高,然而它的实现原理是什么样的呢。
2.算法分析
经过观察,我们发现该算式将参数放在前面,运算操作符放在两个要进行计算的参数之后,我们可以得出这样的思路:每次我们将拿到的数据压栈,当遇见运算符时,就弹出两个数据让他们进行相应的计算,这样,计算完成之后我们再将运算结果入栈,最后我们拿到最终结果!
程序实例:
#include<iostream>
using namespace std;
typedef char Element;
struct Node
{
Element data;
Node *next;
Node(Element d) :data(d), next(NULL)
{}
};
class DStack
{
private:
Node *top;
int size;
public:
DStack() : top(NULL)
{
}
~DStack()
{
if (top != NULL)
{
Node *del = top;
top = top->next;
delete del;
del = NULL;
}
}
public:
void Push(Element d)
{
Node *newNode = new Node(d);
newNode->next = top;
top = newNode;
size++;
}
Element Pop()
{
Element re = top->data;
top = top->next;
size--;
return re;
}
};
int RPN()
{
DStack s1;
char tmp = 0;
int a = 0, b = 0, c = 0;
cout << "please enter a RPN :" << endl;
while (1)
{
cin >> tmp;
if (tmp == '#')
break;
switch (tmp)
{
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
s1.Push(tmp);
break;
case'+':
a = s1.Pop()-'0';
b = s1.Pop() - '0';
c = a + b;
s1.Push(c + '0');
break;
case'-':
a = s1.Pop() - '0';
b = s1.Pop() - '0';
c = a - b;
s1.Push(c + '0');
break;
case'*':
a = s1.Pop() - '0';
b = s1.Pop() - '0';
c = a * b;
s1.Push(c + '0');
break;
case'/':
a = s1.Pop() - '0';
b = s1.Pop() - '0';
c = a / b;
s1.Push(c + '0');
break;
default:
exit(0);
break;
}
}
int re = s1.Pop() - '0';
return re;
}
int main()
{
int a = RPN();
cout << "计算结果是:" << a << endl;
getchar();
getchar();
return 0;
}
综上,我们选择使用switch case控制流机制来实现我们的数据判断使程序显得简洁明了。
本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1754909