java后缀表达式用栈_【数据结构】用栈实现对后缀表达式的计算

首先提一句,我所用的IDE是VS2013。编译器不同,所支持的特性也就不同;

现在的C++已经发展到C++11版本,因此VS2008基本就不支持C++11新的特性;

我们用后缀表达式,利用数据结构中的栈,进行结果的计算

如果是操作数,则压栈

如果是操作符,则出栈两个元素,根据操作符进行计算之后再压栈

#include

using namespace std;

#include"Stack.h"

enum Type//定义一个枚举类型,让我们观察起来更加直观

{

OP_SYMBOL,OP_NUM,ADD,SUB,MUL,DIV,};

struct Cell//定义Cell结构体

{

Type _type;//类型

int _value;//值

};

int CountRPN(Cell* cell,size_t n)

{

Stack s;//这里我们用的是上篇博客自己写的栈,与库提供的稍有区别,这里需要引上篇博客的头文件,否则就改成库函数的

for (size_t idx = 0; idx < n; ++idx)

{

if (cell[idx]._type == OP_NUM)//判断是否为操作数,是操作数就入栈

{

s.Push(cell[idx]._value);

}

else if (cell[idx]._type == OP_SYMBOL)//当类型为操作符,就取出两个元素,求值再压栈

{

int right = s.Top();

s.Pop();

int left = s.Top();

s.Pop();

switch (cell[idx]._value)

{

case ADD:

s.Push(left + right);

break;

case SUB:

s.Push(left - right);

break;

case MUL:

s.Push(left * right);

break;

case DIV:

if (right == 0)

throw invalid_argument("表达式错误");

s.Push(left / right);

break;

default:

throw invalid_argument("表达式错误");

break;

}

}

else//类型错误,抛出异常

{

throw invalid_argument("表达式错误");

}

}

return s.Top();//返回栈中最后一个元素,就是我们求得的结果

}

相关文章

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

你可能感兴趣的:(java后缀表达式用栈)