用栈实现后缀表达式求解问题
来源:互联网 发布:淘宝卖家打假关店 编辑:程序博客网 时间:2024/05/29 15:36
一、问题概述:
人们经常书写的数学表达式属于中缀表达式,今天要解决的是,后缀表达式的求解问题。
如下图分别为举例的中缀表达式和后缀表达式:
二、解决思路
我们用栈存储后缀表达式中的数据部分,当遇到操作符时就取出栈中的栈顶两个元素,检测操作符的类型,并进行相应的计算(这里要注意的是,对于除法运算,栈顶的两个元素的位置得区分)。
如下所示:
三、实现代码
//Expression.h
#pragma once#include<stack>#include<assert.h>enum Type{OP_SYMBOL,OP_NUM,ADD,SUB,MUL,DIV};struct Cell{Type _type;int _value;};void FunTest(){Cell RPN[] = {{OP_NUM,12},{OP_NUM,3},{OP_NUM,4},{OP_SYMBOL,ADD},{OP_SYMBOL,MUL},{OP_NUM,6},{OP_SYMBOL,SUB},{OP_NUM,8},{OP_NUM,2},{OP_SYMBOL,DIV},{OP_SYMBOL,ADD}};stack<int> s;for(size_t i = 0; i < sizeof(RPN)/sizeof(RPN[0]);++i){if(RPN[i]._type == OP_NUM){s.push(RPN[i]._value);}else if(RPN[i]._type == OP_SYMBOL){int second = s.top();s.pop();int first = s.top();s.pop();switch(RPN[i]._value){case ADD:s.push(first+second);break;case SUB:s.push(first-second);break;case MUL:s.push(first*second);break;case DIV:s.push(first/second);break;default:assert(false);}}else{assert(false);}}cout<<s.top()<<endl;}
//Expression.cpp
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;#include"Expression.h"int main(){FunTest();return 0;}
后缀表达式就说到这里喽,有需要改进得地方,欢迎提出宝贵意见哦。
0 0
- 用栈实现后缀表达式求解问题
- 用栈实现算术表达式求解问题
- 数据结构----顺序栈实现逆波兰表达式(后缀表达式)求解
- 栈的应用1;后缀表达式求解
- 求解算术表达式结合二叉树的后缀表达式问题
- 求解后缀表达式(RPN)
- 数据结构之利用栈将中缀表达式求解后缀表达式
- 简单的用栈实现后缀表达式
- 中缀表达式转化为后缀表达式、后缀表达式求解(栈)
- 关于用堆栈实现中后缀表达式计算的问题
- (1.2.2.1)栈和队列的应用:数制转换、括号匹配、后缀表达式求解,中缀表达式求解、双栈实现队列,min函数栈
- C用栈实现中缀表达式转后缀表达式
- 用数组顺序栈实现表达式运算(后缀表达式)
- 栈实现后缀表达式求值
- 栈的应用之后缀表达式的求解
- 栈实现中缀表达式转为后缀表达式
- 后缀表达式通过栈实现表达式树
- 表达式计算,输出后缀表达式,栈实现
- Unity跨iOS、Android平台使用protobuf-net的方法
- 主存到Cache直接映射、全相联映射和组相联映射
- linux上部署zookeeper伪集群
- 采用二分查找(即折半查找)的方法实现查找
- 简单的,不同进程间通过消息队列通信
- 用栈实现后缀表达式求解问题
- Animator组件中Controller里的Clip Count为0
- 关于JAVA中的JNA
- css的权重
- 靠谱,是最低成本的社交方式
- 如何:click once把程序引用到的文件夹加入到“应用程序文件”列表里
- Swift3.0中文教程:2.基本运算符
- Sicily---1034. Forest
- javascript正则表达式总结(test|match|search|replace|split|exec)