⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ep10_3.cpp

📁 这里有大量的c语言习题呢!真的是题海哦
💻 CPP
字号:
/*10.3利用C++标准库的异常类结构,为顺序栈【例7.6】添加异常处理机构。
栈满时的处理是把栈空间加倍,原栈内容拷入之后,再压栈。
未用利用C++标准库的异常类结构,可由学生自己替换。*/
#include<iostream>
using namespace std;
template<typename T>class pushOnFull{
	T _value;
public:
	pushOnFull(T i){_value=i;}
	T value(){return _value;}
	void print(){cerr<<"栈满,"<<value()<<"未压入栈,栈需加倍."<<endl;}
};
template<typename T>class popOnEmpty{
public:
	void print(){cerr<<"栈已空,无法出栈"<<endl;}
};
template<typename T>class stackfail{
public:
	void print(){cerr<<"栈空间无法加倍,请按任意键退出"<<endl;}
};

template<typename T>class Stack{
	int top;                                    //栈顶指针(下标)
	T *elements;                               //动态建立的数值
	int maxSize;                               //栈最大允纳的元素个数
public:
	Stack(int=20);                              //栈如不指定大小,设为20元素
	~Stack(){delete[] elements;}
	void Push(const T &data);//压栈
	T Pop();                            //弹出,top--
	T GetElem(int i){return elements[i];}//返回指定元素,top不变
	void MakeEmpty(){top= -1;}                  //清空栈
	bool IsEmpty() const{return top== -1;}          //判栈空
	bool IsFull() const{return top==maxSize-1;}      //判栈满
	void PrintStack();	//输出栈内所有数据
	void StackFull();
};
template<typename T> Stack<T>::Stack(int maxs){
	maxSize=maxs;
	top=-1;
	elements=new T [maxSize];                     //建立栈空间
}
template<typename T> void Stack<T>::PrintStack(){
	for(int i=0;i<=top;i++) cout<<elements[i]<<'\t';
	cout<<endl;
}
template<typename T> void Stack<T>::Push(const T &data){
	if(IsFull())  throw pushOnFull<T>(data);//栈满则抛出异常
	elements[++top]=data;//栈顶指针先加1,元素再进栈,top是指向栈顶元素
}
template<typename T>T Stack<T>::Pop(){
	if(IsEmpty())  throw popOnEmpty<T>(); //栈已空则不能退栈,抛出异常
	return elements[top--];				//返回栈顶元素,同时栈顶指针退1
}
template<typename T> void Stack<T>::StackFull(){//堆栈加倍
	T * el=elements;
	int i=maxSize,j;
	maxSize*=2;         //加倍栈空间
	if(maxSize<=32)	elements=new T [maxSize];//条件语句是为了演示分配不成功
	else elements=NULL;
	if(elements==NULL) throw stackfail<T>();      //分配不成功抛出异常
	for(j=0;j<i;j++) elements[j]=el[j];
	delete [] el;
}

int main(){
	int a[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,}, b[20]={0},i;
	Stack<int>istack(4);
	
	for(i=0;i<20;i++){
		try{istack.Push(a[i]);}//到a[4],a[8],a[16]时栈满,异常
		catch(pushOnFull<int>&eObj){
			eObj.print();
			try{istack.StackFull();}
			catch(stackfail<int>&eObj){
				eObj.print();
				cin.get();
				return -1;
			}
			istack.Push(eObj.value());
		}
	}
	istack.PrintStack();
	cout<<"数据出栈:"<<endl;
	try{for(i=0;i<21;i++){
			b[i]=istack.Pop();
			cout<<b[i]<<'\t';
		}
		cout<<endl;
	}
	catch(popOnEmpty<int>&eObj){ eObj.print();}
	try{for(i=0;i<41;i++){
			istack.Push(a[i%20]);
			cout<<a[i%20]<<'\t';
		}
	}
	catch(pushOnFull<int>&eObj){
		eObj.print();
		try{istack.StackFull();}
		catch(stackfail<int>&eObj){
			eObj.print();
			cin.get();
			return -1;
		}
		istack.Push(eObj.value());
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -