加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 05:56:09 所属栏目:安全 来源:网络整理
导读:首先提一句,我所用的IDE是VS2013。编译器不同,所支持的特性也就不同; 现在的C++已经发展到C++11版本,因此VS2008基本就不支持C++11新的特性; 我们用后缀表达式,利用数据结构中的栈,进行结果的计算 如果是操作数,则压栈 如果是操作符,则出栈两个元素

首先提一句,我所用的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();//返回栈中最后一个元素,就是我们求得的结果
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读