栈程序演示(C++)
示例代码
main.cpp
#include <iostream>
using namespace std;
#include "Stack.h"
int main()
{
Stack s1(2); // 创建一个栈,容量为2
s1.push('x');
s1.push('y');
cout << s1.isFull() << endl;
cout << s1.getTop() << endl;
cout << s1.pop() << endl;
cout << s1.pop() << endl;
cout << s1.isEmpty() << endl;
return 0;
}
Stack.cpp
#include "Stack.h"
Stack::Stack() // 无参构造函数
{
size = MAX_SIZE;
top = -1;
data = new char[MAX_SIZE];
}
Stack::Stack(int s) // 有参构造函数
{
size = s;
top = -1;
data = new char[size]; // 根据指定的大小分配栈的内存空间
}
Stack::~Stack()
{
delete[] data; // 内存回收
}
void Stack::push(char ch) // 成员函数: 入栈
{
if (!isFull())
{
data[++top] = ch; // top 先+1,然后 ch 存入到该位置
}
}
char Stack::pop() // 成员函数: 出栈并返回栈顶元素
{
if (!isEmpty())
{
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)
return true;
else
return false;
}
void Stack::setNull() // 设置栈为空
{
top = -1;
}
Stack.h
#pragma once
const int MAX_SIZE = 100; // 定义栈最大值常量
class Stack
{
private:
char* data; // 属性: 线性表
int size; // 属性: 堆栈的实际大小
int top; // 属性: 栈顶
public:
Stack(); //构造函数
Stack(int s); // 有参构造函数
~Stack(); // 析构函数
void push(char ch); // 成员函数: 入栈
char pop(); // 成员函数: 出栈并返回栈顶元素
char getTop(); // 成员函数: 获得栈顶元素(不出栈)
bool isEmpty(); // 成员函数: 栈是否为空
bool isFull(); // 成员函数: 栈是否满
void setNull(); // 设置栈为空
};
C++异常处理
try 块包含有可能抛出异常的语句
catch 块捕获异常,可能有多个,但至少有一个
try…catch语句
try
{
语句1
语句2
语句3
...
}
catch(异常类型)
{
异常处理代码
}
catch(异常类型)
{
异常处理代码
}
异常处理流程
流程1:无异常
try 块中的语句均正确,在执行过程中没有异常抛出
会执行 try…catch 后面的其他语句,catch语句不会执行
流程2:有异常并捕获
假设
语句 1 正确
语句 2 发生异常,那么抛出异常后立即跳转到第一个 “异常类型 ” 和抛出的异常类型匹配的 catch 块中执行。不会执行 try 中语句2 后的其他语句。
异常处理结束之后,会执行 try…catch 结构之后的其他语句
流程3:有异常未捕获
假设
语句1 正确
语句2 有异常,假设没有 catch 块可以 “捕获 ” 此错误
那么当经过了所有的 catch 语句,准备执行 其他语句时,会造成程序的终止
自定义异常类的使用
-
定义异常内部类(在类的声明部分定义)
class Empty { }; -
丢出异常类(在 pop 函数遇到空栈时的语句)
throw Empty { }; -
捕获异常类(在调用 pop 函数时,用 try / catch 捕获)
try
{
Stack.pop();
}
catch(Stack::Empty)
{
cout << "Stack Empty!!" << endl;
}
示例代码优化
main.cpp
#include <iostream>
using namespace std;
#include "Stack.h"
int main()
{
Stack s1(2); // 创建一个栈,容量为2
char ch;
try
{
s1.push('a');
s1.push('b');
s1.push('c'); // 到这里会出现异常,跳进 catch 处理
}
catch (Stack::Full)
{
cout << "Stack Full!!" << endl;
}
try
{
ch = s1.pop();
cout << ch << endl;
ch = s1.pop();
cout << ch << endl;
ch = s1.pop(); // 到这里会出现异常,跳进 catch 处理
cout << ch << endl;
}
catch(Stack::Empty)
{
cout << "Stack Empty!!" << endl;
}
return 0;
}
Stack.cpp
修改的部分
Stack.h
输出结果