- 浏览: 128645 次
- 性别:
- 来自: 成都
最新评论
-
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 1131这里面包含了所有常见的排序操作 1.性能等比较分析 2 ... -
常见字符串操作大全
2012-08-12 11:34 14161.常见的字符串操作 如计算长度,求子串等都是考验基本功的, ... -
KMP算法解析
2012-08-12 11:35 2773一.理论基础 1.什么 ... -
二叉堆的实现
2012-08-12 11:35 11721.堆的概念 这里只需要注意两点: a.堆的存储方式:就是 ... -
set和map的简单实现
2012-08-10 11:35 12751.Set的简单实现 set是利用二叉查找树来实现的,而且为 ... -
红黑树的插入总结
2012-08-10 11:25 9051.红黑树 这个在july的博客中有详尽的说明,我就不在赘述 ... -
B-树实现
2012-08-10 11:03 15861.什么是B-树? 这个在我的前一篇博客中已经详细的阐释过: ... -
平衡二叉树
2012-08-10 10:39 27931.问题描述 什么是平衡 ... -
二叉排序树
2012-08-10 10:25 14151.基本概念 二叉排 ... -
B-树
2012-07-04 22:48 56091.B-树的概念 是一种多 ... -
构造哈夫曼树
2012-07-04 10:40 11871.算法说明 就是建造哈夫曼树树,从而使得构造出的树带权路径 ... -
线索二叉树
2012-07-04 09:20 12371.算法描述 就是简单的线索二叉树的建立,遍历,查找等基本操 ... -
二叉树基本操作大全
2012-07-03 18:22 25541.二叉树的基本操作 这里我有一个疑问: 在使用构造 ... -
多种队列的实现
2012-06-29 10:09 14911.算法描述 a.数据结构与算法(Mark Allen We ... -
栈的各种实现
2012-06-28 16:34 10731.算法描述 a.实现二个栈,在一个数组里面,除非没有任何空 ... -
中缀表达式转换为后缀
2012-06-28 11:10 17501.算法描述 例如a+b*c这是常见的中缀表达式,但是 ... -
Josephus问题
2012-06-21 15:30 9531.算法描述 简单的游戏:有N个人坐成一圈,编号1-N、从编 ... -
关于最长递增子序列的实际应用--动态规划
2012-06-07 11:35 1788参考链接: a.http://www.programfan. ... -
线性查找二维数组
2012-06-05 17:23 9991.算法描述 有序(行有序,列有序,且每行从左至右递增 ... -
整数的随机置换
2012-06-05 15:10 2230算法描述:生成前N个整 ...
相关推荐
实现数据结构中后缀表达式值的c语言完整可运行代码。
2) 掌握栈的典型应用——后缀表达式求值。 2. 实验内容 1) 用键盘输入一个整数后缀表达式(操作数的范围是0~9,运算符只含(、(、*、/,而 且中间不可以有空格),使用循环程序从左向右读入表达式; 2) 如果读入的...
将中缀表达式,转换为后缀表达式和前缀表达式,再分别计算转换后的表达式值,比较两个计算结果,判断转换正确性和计算正确性。 ·编程 (1)读入中缀表达式,表达式的数据可以是实型、整型; (2)转换为后缀表达式...
使用键盘输入表达式,计算表达式的值并输出;将表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。
用数据结构栈实现后缀表达式求值的问题 输入一个后缀表达式 可计算出它的值
表达式求值(根据原表达式得到后缀表达式计算) 表达式中只限输入整数
后缀表达式求值.cpp
自定义栈,中缀表达式转换为后缀表达式并求值,三个抽象数据类型定义(1.class stack 2.class Middle_expressionToPost_expression 3.class Post_expression_value)
由于工作中的需要,自己整理的一个后缀表达式计算求值实例,采用VS2008写的工程,希望对大家有用。
关于表达式求值的数据结构代码,程序采用栈结构实现表达式输入和输出及求值,输出结果是中缀表达式和算式的正确结果
用户输入中缀表达式,程序输出后缀表达式并输出计算结果
利用后缀表达式计算中缀表达式的值.数据结构 花费了我2周的时间才完成的 数据结构 c语言 MFC,是用MFC做的,,该程序功能强大,健壮性很强,对于错误输入有提示,程序完全正确,解压既可以运行
按照惯例,算术表达式一般都写成中缀形式,即运算符总是出现在两个操作数之间,单目运算符除外),称为中缀表达式.编译系统对中缀表达式的处理方法是先把它转换为后后缀表达式.... (2) 根据后缀表达式计算表达式的值;
数据结构课程设计实验报告(后缀表达式的计算),无论如何,别错过
后缀表达式求值,练习堆栈,算法。大家需要可以参考下
输入表达式 打印出后缀表达式 再求值 用栈实现
逆波兰式也叫后缀表达式(将运算符写在**作数之后) 如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+ (a+b)*c-(a+b)/e的后缀表达式为: (a+b)*c-(a+b)/e →((a+b)*c)((a+b)/e)- →((a+b)c*)(...
这是数据结构里的一个后缀表达式求值问题,小数和十位上的数计算都能求值 主要用到栈
1)利用栈将中缀表示转换成后缀表示,从主键盘上输入一个中缀表达式(以‘=’结束),将其转换成后缀表达式...(2)应用后缀表示计算表达式的值,求从一个输入文件中输入的后缀表达式的值,将表达式的值在屏幕上显示出来
顺序栈,求出表达式的后缀表达式, 用后缀表达式求值,有栈的相关操作,