- 浏览: 131479 次
- 性别:
- 来自: 成都
最新评论
-
yi_chao_jiang:
你好,多谢分享,问个问题,在上传数据的时候判断文件是否有上传记 ...
断点续传和下载原理分析 -
a41606709:
为什么我的tabhost显示不出来? 怎么设置在全部页面中让他 ...
TabActivity中的Tab标签详细设置 -
Zero颴:
大神篇,思路,配图都很清晰,perfect!
Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解 -
QAZ503602501:
牛死人了!!!
B-树 -
mengsina:
很牛的文档。数学功底好啊
Android Matrix理论与应用详解
1.算法描述
计算后缀表达式的值
2.事例
如:(2+3)*5--->后缀表达式:23+5*,或者523+*
在计算机中不能直接处理算术表达式,我们就转换为后缀表达式利用栈来解决这个问题
3.思想
利用数据结构栈
a.后缀表达式依次入栈,如果遇到操作符,就将栈顶两个元素出栈,计算结果在入栈。
b.循环进行,直到栈中只有一个元素,就是结果
4.算法
异常处理类:
#ifndef DSEXCEPTIONS_H #define DSEXCEPTIONS_H //#include <exception> class StackOverFlowException{ //public: exception public: const char* what() const throw() { return "stack over flow exception, the size<=0 !\n"; } }; #endif
栈实现:
#ifndef STACK_H #define STACK_H #include <iostream> #include "dsexceptions.h" template<class T> struct Node{ Node<T>* next; T data; }; template<class T> class stack{ public: stack(){ first = new Node<T>; first->next = NULL; end = first; length = 0; } stack(T a[], int n){ first = new Node<T>; length = n; Node<T> *r = first; for(int i=0; i<n; i++){ Node<T> *t = new Node<T>; t->data = a[i]; t->next = r; r = t; } end = r; } ~stack(){ freeStack(); } T pop(){ T data; if(length != 0){ Node<T>* r = end; end = end->next; data = r->data; delete r; length--; }else{ throw StackOverFlowException(); } return data; } void push(T x){ Node<T> *r = new Node<T>; r->data = x; r->next = end; end = r; length++; } T top() const{ if(length == 0) throw StackOverFlowException(); return end->data; } bool empty() const{ if(length == 0) return true; return false; } int size() const{ return length; } void printStack() const{ std::cout<<"["; Node<T> *r = end; while(r != first){ std::cout<<r->data<<" "; r = r->next; } std::cout<<"]"<<std::endl; } private: Node<T>* first;//栈底 Node<T>* end;//栈顶 int length; void freeStack(){ Node<T> *r = end, *t; while(r != first){ t = r; r = r->next; delete t; } delete r; } }; #endif
测试:
#include <iostream> #include <cmath> #include "stack.h" using namespace std; //判断是否是操作符 bool isOper(char ch){ if((ch == '+') || (ch == '-') || (ch == '*') || (ch == '/') || (ch == '%') || (ch == '^')) return true; return false; } //计算表达式的值 int compute(int left, int right, char oper){ int result; switch (oper) { case '+': result = left + right; break; case '-': result = left - right; break; case '*': result = left * right; break; case '/': if (right == 0) { throw "除数不能为0!"; } else result = left / right; break; case '%': if (right == 0) { throw "除数不能为0!"; } else result = left % right; break; case '^': if ((left == 0) || (right == 0)) { throw "操作数不能为0!"; } else result = pow(right, left); break; } return result; } //获取左右操作数 void getOperands(stack<int> &t,int &left, int &right){ if(t.empty()) throw "操作符太多!"; else right = t.pop(); if(t.empty()) throw "操作符太多!"; else left = t.pop(); } int main(){ //char a[] = {'3','2','+','5','*','3','2','*','-'}; char a[] = {'3','2','5','+','*'}; int len = sizeof(a)/sizeof(char); stack<char> s(a, len); s.printStack(); s.push('8'); s.printStack(); s.pop(); s.printStack(); cout<<s.top()<<endl; cout<<s.empty()<<endl; cout<<s.size()<<endl; cout<<"后缀表达式计算"<<endl; stack<int> t; int left, right; for(int i=0; i<len; i++){ try{ if(!isOper(a[i])){ t.push(a[i]-'0'); }else{ getOperands(t, left, right); t.push(compute(left, right, a[i])); } }catch(char const* s){ cout<<"抛出异常:"<<s<<endl; } } cout<<"计算后缀表达式的值:"; try{ cout<<t.top()<<endl; }catch(StackOverFlowException &e){ cout<<"\n异常:"<<e.what(); } t.printStack(); return 0; }
5.说明
a.栈结构:
这里栈使用链表实现,好处是大小动态增长。
b.异常处理(我是自定义异常,没有继承exception)
两个参考网址:
http://blog.csdn.net/btwsmile/article/details/6685549
http://tech.ddvip.com/2006-12/116514811312868_2.html
异常处理在c++中是一个非常好的特性,我们要充分利用。
在里面用到的地方:1.栈检测,检测是否达到栈底,尤其是pop(), top()操作
在使用时,要用try..catch捕获,防止异常发生。
2.是判断输入的合法性,看是否操作符过多等问题,如果是则要捕获异常
发表评论
-
排序方法总结
2012-08-12 11:34 1176这里面包含了所有常见的排序操作 1.性能等比较分析 2 ... -
常见字符串操作大全
2012-08-12 11:34 14601.常见的字符串操作 如计算长度,求子串等都是考验基本功的, ... -
KMP算法解析
2012-08-12 11:35 2835一.理论基础 1.什么 ... -
二叉堆的实现
2012-08-12 11:35 12111.堆的概念 这里只需要注意两点: a.堆的存储方式:就是 ... -
set和map的简单实现
2012-08-10 11:35 13161.Set的简单实现 set是利用二叉查找树来实现的,而且为 ... -
红黑树的插入总结
2012-08-10 11:25 14051.红黑树 这个在july的博客中有详尽的说明,我就不在赘述 ... -
B-树实现
2012-08-10 11:03 16251.什么是B-树? 这个在我的前一篇博客中已经详细的阐释过: ... -
平衡二叉树
2012-08-10 10:39 28481.问题描述 什么是平衡 ... -
二叉排序树
2012-08-10 10:25 14751.基本概念 二叉排 ... -
B-树
2012-07-04 22:48 56661.B-树的概念 是一种多 ... -
构造哈夫曼树
2012-07-04 10:40 12301.算法说明 就是建造哈夫曼树树,从而使得构造出的树带权路径 ... -
线索二叉树
2012-07-04 09:20 12741.算法描述 就是简单的线索二叉树的建立,遍历,查找等基本操 ... -
二叉树基本操作大全
2012-07-03 18:22 26031.二叉树的基本操作 这里我有一个疑问: 在使用构造 ... -
多种队列的实现
2012-06-29 10:09 15511.算法描述 a.数据结构与算法(Mark Allen We ... -
栈的各种实现
2012-06-28 16:34 11091.算法描述 a.实现二个栈,在一个数组里面,除非没有任何空 ... -
中缀表达式转换为后缀
2012-06-28 11:10 18261.算法描述 例如a+b*c这是常见的中缀表达式,但是 ... -
Josephus问题
2012-06-21 15:30 9961.算法描述 简单的游戏:有N个人坐成一圈,编号1-N、从编 ... -
关于最长递增子序列的实际应用--动态规划
2012-06-07 11:35 1830参考链接: a.http://www.programfan. ... -
线性查找二维数组
2012-06-05 17:23 10301.算法描述 有序(行有序,列有序,且每行从左至右递增 ... -
整数的随机置换
2012-06-05 15:10 2318算法描述:生成前N个整 ...
相关推荐
通常,求后缀表达式值的函数会遍历后缀表达式,每遇到一个数字就压入操作数栈,每遇到一个运算符就从栈中取出相应的操作数进行运算并替换为结果。主函数将串接整个程序并负责输入输出,包括接收用户输入的后缀表达式...
根据给定的文件信息,我们可以总结出以下关于“后缀表达式求值”的详细知识点,主要涉及C语言在数据结构中的应用,特别是栈的应用来解析和计算后缀表达式。 ### 1. 后缀表达式的概念 后缀表达式,也称为逆波兰表示...
后缀表达式求值后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀表达式求值.rar后缀...
后缀表达式(逆波兰式)求值 本资源主要介绍了后缀表达式(逆波兰式)求值的实现,通过使用栈数据结构来实现逆波兰式求值。下面是相关知识点的详细解释: 1. 栈数据结构 栈是一种后入先出(Last In First Out,...
工程中的文件,如`RegExp1.cpp`和`stdafx.cpp`,可能包含了后缀表达式求值的实现代码,`targetver.h`和`stdafx.h`是VS项目的标准头文件,包含预编译的头信息。`ReadMe.txt`文件可能是开发者提供的说明文档,解释了...
后缀表达式,又称逆波兰表示法,是一种用于表示数学表达式的方式,它将运算符放在操作数之后,使得表达式求值的过程可以利用栈这种数据结构来简化。栈是一种具有“后进先出”(LIFO)特性的数据结构,非常适合处理这...
后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现...
在本实验报告中,主要涉及的是中缀表达式与后缀表达式的转换以及求值问题。中缀表达式是我们常见的运算符位于操作数之间的表达形式,例如 `6+3*(6+5)`,而后缀表达式又称逆波兰表示法,其中运算符位于其操作数之后,...
### 自定义栈中缀表达式转换为后缀表达式并求值 #### 需求分析与背景 在计算机科学领域,将一个中缀表达式转换为后缀表达式是解决算术表达式求值问题的一种常用方法。通过这种方式可以避免括号带来的优先级问题,...
将中缀表达式,转换为后缀表达式和前缀表达式,再分别计算转换后的表达式值,比较两个计算结果,判断转换正确性和计算正确性。 ·编程 (1)读入中缀表达式,表达式的数据可以是实型、整型; (2)转换为后缀表达式...
后缀表达式,又称逆波兰表示法,是一种数学表达式表示方法,它将运算符放在操作数之后,常用于计算和表达式求值。在计算机科学中,后缀表达式求值是解决复杂算术表达式计算问题的有效手段。本压缩包文件提供了后缀...
总之,这个程序展示了如何使用数据结构,特别是栈,以及C语言和MFC来实现后缀表达式计算中缀表达式的值。通过理解和分析这个程序,可以深入理解栈的工作原理,以及如何在实际应用中利用数据结构和编程技术解决问题。...
根据给定的信息,本文将详细解释“C后缀表达式求值的源代码”这一主题。主要内容包括:后缀表达式的概念、栈的基本原理及应用、C语言中的栈实现方式,以及如何通过栈来实现后缀表达式的求值。 ### 一、后缀表达式...
表达式求值(根据原表达式得到后缀表达式计算) 表达式中只限输入整数
4. **后缀表达式计算**:使用堆栈来计算后缀表达式的值。遍历后缀表达式的每个元素,如果遇到数字,将其压入堆栈;如果遇到操作符,弹出堆栈顶的两个操作数,进行相应的运算,然后将结果压回堆栈。这样,当遍历完成...
后缀表达式求值.cpp
本压缩包文件“C 语言 后缀表达式求值-1.cpp.rar”包含了两个相关的C++源代码文件,即“实验3:后缀表达式求值-1.cpp”和“实验3:后缀表达式求值-2.cpp”,可能是用于教学或练习的示例代码。 后缀表达式求值的核心...
后缀表达式求值后缀表达式求值简介及基础教程和实用案例分析及特点阐述.rar后缀表达式求值简介及基础教程和实用案例分析及特点阐述.rar后缀表达式求值简介及基础教程和实用案例分析及特点阐述.rar后缀表达式求值简介...
数据结构课程设计实验报告的主题是“后缀表达式的计算”,这是一种高效的方法来处理数学表达式。后缀表达式,也称为逆波兰表示法,是一种没有括号的表达式表示方式,其中运算符位于它们的操作数之后。这种表示法在...
### 获取键盘输入一个中缀表达式,将它转换成后缀表达式,并输出结果 #### 知识点一:中缀表达式与后缀表达式的概念 - **中缀表达式**:通常我们书写的数学表达式就是中缀表达式,如`3 + 4 * 2`。在中缀表达式中,...