您的位置:首页 > 理论基础 > 数据结构算法

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

2016-11-27 17:12 302 查看
首先提一句,我所用的IDE是VS2013。编译器不同,所支持的特性也就不同;
现在的C++已经发展到C++11版本,因此VS2008基本就不支持C++11新的特性;



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



如果是操作数,则压栈
如果是操作符,则出栈两个元素,根据操作符进行计算之后再压栈
#include<iostream>
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<int> 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();//返回栈中最后一个元素,就是我们求得的结果
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  后缀表达式