【C++】栈空栈满异常处理

异常处理的机制:

1.如果没有异常发生,继续执行try块中的代码,与try块相关联   的catch子句被忽略,程序正常执行,main()返回0。

2.当第一个try块在for循环中抛出异常,则该for循环退出,try块也退出,去执行pushOnFull异常的catch子句。istack.PrintStack()不再执行,被忽略。

3.如果第二个try块调用Pop()抛出异常,则退出for和try块,去执行popOnEmpty异常的catch子句。

4.当某条语句抛出异常时,跟在该语句后面的语句将被跳过。程序执行权交给处理异常的catch子句,如果没有catch子句能够处理异常,则交给C++标准库中定义的terminate()。

具体异常处理代码如下:

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;

//异常类
template<class Type>
class PushOnFull                    //栈满异常
{
public:
	PushOnFull(string s):str(s)
	{}
	Type GetData()const
	{
		return data;
	}
	string what()                   //输出提示语句
	{
		return str;
	}
	bool ReMalloc()
	{
		return true;
	}
private:
	string str;
};

template<class Type>
class PopOnEmpty                     //栈空异常
{
public:
	PopOnEmpty(string s):str(s)
	{}
	string what()const               //输出提示语句
	{
		return str;
	}
private:
	string str;
};

template<class Type>
class Stack                           //栈
{
public:
	Stack(int sz=SIZE)
	{
		capacity = sz>SIZE?sz:SIZE;
		base = new Type[capacity];
		top = 0;
	}
	~Stack()
	{
		delete []base;
		base = NULL;
	}
public:
	bool IsFull()const                    //判断是否为满
	{
		return top >= capacity;
	}
	bool IsEmpty()const                   //判断是否为空
	{
		return top == 0;
	}
	void Push(const Type &x)              //入栈
	{
		if(IsFull())
		{
			string str("栈满入栈异常发生!");
			throw PushOnFull<Type>(str);  //抛出异常
		}
		base[top++] = x;
	}
	void Pop()                            //出栈
	{
		if(IsEmpty())
		{
			string str = "发生栈空出栈异常!";
			throw PopOnEmpty<Type>(str);  //抛出异常
		}
		top--;
	}

private:
	enum{SIZE=8};
	Type *base;
	size_t capacity;
	int    top;
};

void main()
{
	Stack<int> st;
	try                                    //异常处理
	{
		for(int i=1; i<=5; ++i)
		{
			st.Push(i);
		}
	}
	catch(PushOnFull<int> &e)              //捕获异常
	{
		cout<<e.what()<<endl;
	}

	try                                   //异常处理
	{
		for(int i=0; i<10; ++i)
		{
			st.Pop();
		}
	}
	catch(PopOnEmpty<int> &exp)           //捕获异常
	{
		cout<<exp.what()<<endl;
	}
}

有什么问题希望大家可以指出,谢谢大家~

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-30 06:03:57

【C++】栈空栈满异常处理的相关文章

6.2-全栈Java笔记:异常处理机制的分类

异常分类 JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例.如果内置的异常类不能够满足需要,还可以创建自己的异常类. 图1 异常的分类  Error Error类层次描述了Java运行时系统内部错误和资源耗尽错误.这类错误是我们无法控制的,同时也是非常罕见的错误.所以在编程中,不去处理这类错误. Error表明系统JVM已经处于不可恢复的崩溃状态中.我们不需要管他. 图2 java.lang包中Error的类 Error与E

6.1-全栈Java笔记:异常处理机制的概念

异常问题 实际工作中,遇到的情况不可能是非常完美的.比如:你写的某个模块,用户输入不一定符合你的要求.你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等.我们的程序再跑着,内存或硬盘可能满了等等. 软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外.这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处理,安全的退出,而不至于程序崩溃. 如果我们要拷贝一个文件,在没有异常机制的情况下,我

6.3-全栈Java笔记:异常处理方法(上)

异常的处理办法之一  捕获异常 图1 异常处理 上面过程详细解析: 1.try块: try语句指定了一段代码,该段代码就是一次捕获并处理的范围.在执行过程中,当任意一条语句产生异常时,就会跳过该段中后面的代码.代码中可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理. 一个try语句必须带有至少一个catch语句块或一个finally语句块 . 注意事项 当异常处理的代码执行结束以后,是不会回到try语句去执行尚未执行的代码. 2.catch: 1)每个

6.4-全栈Java笔记:异常处理办法(下)

自定义异常 在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以创建自己的异常类. 从Exception类或者它的子类派生一个子类即可 . 习惯上,定义的类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器. [示例1]自定义异常类 class    IllegalAgeException      extends   Exception { public IllegalAgeException   () { } public IllegalAgeExc

栈和队列分别的顺序结构和链式结构

栈和队列 栈和队列本身作为特殊的线性表,要记住他俩本身就费劲.难受的是他俩还能分别考虑顺序结构和链式结构,很复杂,容易混淆. 其实比起FILO(先进后出)和FIFO(先进先出)等特点,更重要的是对指针的把握.进出顺序是在逻辑层面的,只要理解就行,难得是如何用指针来表示这种特点,于是我就此方面进行个总结. 顺序栈 虽然栈只需要对一段进行操作(栈顶),但我们除了栈顶指针(top)外,还需要设置栈底指针(base),主要是为了用于判断栈空栈满. s.top == s.base; //当栈顶指针等于栈底

201621123042《java程序设计》第十次作业

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 答: ArrayIndexOutOfBoundsException非法索引访问数组 ClassCastException类型强制转换异常 NullPointerException空指针异常,所调用的对象为null NumberFormatExceptio

第三章小结

第三章学习了栈和队列. 有一个要搞清楚的点是 栈和队列的每一次操作都只对一个元素起作用.之前在学习计概这门课的时候,就已经接触了栈和队列的知识,知道LIFO和FIFO结构.但是没有学太深. 现在知道了栈和队列的作用以及一些基本的算法和主要操作. 总结: (1)顺序栈与链栈 主要操作:1.InitStack(SqStacke &S)(初始化)2.Push(SqStack &S,SElemType e)(入栈)3.Pop(SqStack &S,SElemType &e)(出栈)

栈的C++实现(指针)——创建-push-pop-top-清空栈-处理栈

今天学习了栈的C++实现,跟单链表很像: push相当于单链表在第一个位置插入元素: pop相当于单链表在第一个位置删除元素: 1.空栈检查 1 int stack::isEmpty(Stack *S) 2 { 3 return S->next == NULL; 4 } 2.创建一个空栈 1 stack::Stack *stack::createStack() 2 { 3 Stack *S; 4 S = (Stack*)new(Stack); 5 //栈空间满后,溢出 6 if (S == NU

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看