`
hao3100590
  • 浏览: 131479 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

后缀表达式的值

阅读更多

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.是判断输入的合法性,看是否操作符过多等问题,如果是则要捕获异常

 

  • 大小: 2 KB
分享到:
评论

相关推荐

    数据结构-实验3-后缀表达式求值.doc

    通常,求后缀表达式值的函数会遍历后缀表达式,每遇到一个数字就压入操作数栈,每遇到一个运算符就从栈中取出相应的操作数进行运算并替换为结果。主函数将串接整个程序并负责输入输出,包括接收用户输入的后缀表达式...

    后缀表达式求值(c语言版)

    根据给定的文件信息,我们可以总结出以下关于“后缀表达式求值”的详细知识点,主要涉及C语言在数据结构中的应用,特别是栈的应用来解析和计算后缀表达式。 ### 1. 后缀表达式的概念 后缀表达式,也称为逆波兰表示...

    后缀表达式求值.rar

    后缀表达式求值后缀表达式求值.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语言实现后缀表达式的求值算法; 后缀表达式求值:使用Java语言实现...

    将中缀表达式转换为后缀表达式并求值实验报告

    在本实验报告中,主要涉及的是中缀表达式与后缀表达式的转换以及求值问题。中缀表达式是我们常见的运算符位于操作数之间的表达形式,例如 `6+3*(6+5)`,而后缀表达式又称逆波兰表示法,其中运算符位于其操作数之后,...

    自定义栈中缀表达式转换为后缀表达式并求值

    ### 自定义栈中缀表达式转换为后缀表达式并求值 #### 需求分析与背景 在计算机科学领域,将一个中缀表达式转换为后缀表达式是解决算术表达式求值问题的一种常用方法。通过这种方式可以避免括号带来的优先级问题,...

    中缀表达式输入、转换与计算(前缀和后缀)内附流程图

    将中缀表达式,转换为后缀表达式和前缀表达式,再分别计算转换后的表达式值,比较两个计算结果,判断转换正确性和计算正确性。 ·编程 (1)读入中缀表达式,表达式的数据可以是实型、整型; (2)转换为后缀表达式...

    后缀表达式求值包及其使用

    后缀表达式,又称逆波兰表示法,是一种数学表达式表示方法,它将运算符放在操作数之后,常用于计算和表达式求值。在计算机科学中,后缀表达式求值是解决复杂算术表达式计算问题的有效手段。本压缩包文件提供了后缀...

    利用后缀表达式计算中缀表达式的值.数据结构

    总之,这个程序展示了如何使用数据结构,特别是栈,以及C语言和MFC来实现后缀表达式计算中缀表达式的值。通过理解和分析这个程序,可以深入理解栈的工作原理,以及如何在实际应用中利用数据结构和编程技术解决问题。...

    C 后缀表达式求值的源代码

    根据给定的信息,本文将详细解释“C后缀表达式求值的源代码”这一主题。主要内容包括:后缀表达式的概念、栈的基本原理及应用、C语言中的栈实现方式,以及如何通过栈来实现后缀表达式的求值。 ### 一、后缀表达式...

    表达式求值(根据原表达式得到后缀表达式计算)

    表达式求值(根据原表达式得到后缀表达式计算) 表达式中只限输入整数

    java堆栈的应用--中缀表达式转换成后缀表达式和计算

    4. **后缀表达式计算**:使用堆栈来计算后缀表达式的值。遍历后缀表达式的每个元素,如果遇到数字,将其压入堆栈;如果遇到操作符,弹出堆栈顶的两个操作数,进行相应的运算,然后将结果压回堆栈。这样,当遍历完成...

    后缀表达式求值.cpp

    后缀表达式求值.cpp

    C 语言 后缀表达式求值-1.cpp.rar

    本压缩包文件“C 语言 后缀表达式求值-1.cpp.rar”包含了两个相关的C++源代码文件,即“实验3:后缀表达式求值-1.cpp”和“实验3:后缀表达式求值-2.cpp”,可能是用于教学或练习的示例代码。 后缀表达式求值的核心...

    后缀表达式求值简介及基础教程和实用案例分析及特点阐述.rar

    后缀表达式求值后缀表达式求值简介及基础教程和实用案例分析及特点阐述.rar后缀表达式求值简介及基础教程和实用案例分析及特点阐述.rar后缀表达式求值简介及基础教程和实用案例分析及特点阐述.rar后缀表达式求值简介...

    数据结构课程设计实验报告(后缀表达式的计算).

    数据结构课程设计实验报告的主题是“后缀表达式的计算”,这是一种高效的方法来处理数学表达式。后缀表达式,也称为逆波兰表示法,是一种没有括号的表达式表示方式,其中运算符位于它们的操作数之后。这种表示法在...

    获取键盘输入一个中缀表达式,将它转换成后缀表达式,并输出结果

    ### 获取键盘输入一个中缀表达式,将它转换成后缀表达式,并输出结果 #### 知识点一:中缀表达式与后缀表达式的概念 - **中缀表达式**:通常我们书写的数学表达式就是中缀表达式,如`3 + 4 * 2`。在中缀表达式中,...

Global site tag (gtag.js) - Google Analytics