【数据结构】(三)顺序栈(用异常捕获优化顺序栈)
(一)异常处理的三种情况(以及执行流程):
注意:(异常出现情况):
(二)C++中异常类的使用:
定义:异常内部类
相比上次头文件的程序多异常类:
分文件如下:
#include "Stack.h"
//**两种构造方法**//
Stack::Stack() //初始化栈 无参构造大小为Max——SIZE
{
size = MAX_SIZE;
top = -1;
data = new char[MAX_SIZE];
}
Stack::Stack(int s) //如果用有参函数构造,大小为传入的s
{
size = s;
top = -1;
data = new char[size];
}
Stack::~Stack() //释放栈
{
delete[]data;
}
void Stack::push(char ch)
{
if (isFull()) //如果满的话 ,丢出异常,执行丢出异常所该执行的catch语句
{
throw full();
}
else
{
data[++top] = ch;
}
}
char Stack::pop()
{
if (isEmpty()) //如果空,就丢出异常,执行对应的catch语句;
{
throw empty();
}
else
{
return data[top--];
}
}
char Stack::getTop() //获取当前栈顶的元素
{
if (!isEmpty())
{
return data[top];
}
}
bool Stack::isEmpty()
{
if (top == -1)
{
return true;
}
else
{
return false;
}
}
bool Stack::isFull()
{
if (top + 1 == size) //因为top从0开始数
{
return true;
}
else
{
return false;
}
}
void Stack::setNull()
{
top = -1;
}
int main()
{
Stack s1(2);
char ch;
try //这一组的try和catch是用来测试输入的
{
s1.push('a');
s1.push('b');
s1.push('c'); //由于s1(2)定义的是二,所以输出第三个数是会导致异常
}
catch (Stack::full) //那就抛出异常,输出所抛出异常要执行的程序
{
cout << "Stack Full!!" << endl;
}
try //这一组是用来测试输出是否异常
{
ch = s1.pop();
cout << ch << endl;
ch = s1.pop();
cout << ch << endl;
ch = s1.pop(); //只能输出两个,输出第三个抛出异常
cout << ch << endl;
}
catch (Stack::empty) //抛出异常执行此语句
{
cout << "Stack empty!!" << endl;
}
return 0;
}
(三)类模板:
定义解释:使用了template 之后,将类里面的数据类型全部改变为Type,可以自定义使用数据类型,如右上角小图所讲Compare 则Type变为int 之类的
模板:定义和讲解:
注意:分文件写时一定要加入图中代码:
此时就可以用来了:
(四)两栈共享存储空间:
当两个top分别指向两端时,top==-1,两栈为空。
当两个top相遇即满。
num表示处理的栈是那个栈:
插入操作:
删除:
(五)栈的链式存储结构:
构造函数:根据top按图索骥来next将所有的节点输出,
析构函数:同理以top来找到每一个节点来一 一删除,使用循环即可。
插入操作:
弹出操作:(将栈顶元素取出弹出)