目录
结构特性
结构实现
结构容器
结构设计
顺序栈
链式栈
结构特性
-
栈(stack)是线性表的一种形式,限定仅在表的一端进行插入或者删除的操作。
-
栈顶 - 表中允许插入、删除的一端称为栈顶(top),栈顶位置是可以发生变化的。
-
插入 - 进栈、入栈、压栈。
-
删除 - 出栈。
-
-
栈底 - 表中不允许插入、删除的一端称为栈底(bottom),栈底位置通常是固定不变的。
-
空栈 - 表中不存在任何元素。
-
LIFO - last in first out - 先进后出、后进先出。
结构实现
- 顺序栈
int Arr[5] = {0};
[栈顶] - Arr[4]
[元素] - Arr[x]
[元素] - Arr[x]
[元素] - Arr[x]
[栈底] - Arr[0]
-
顺序栈使用连续的内存空间来存储元素,通常使用数组来实现。
-
栈底指向数组起始地址(下标为0的元素)。
-
栈顶指向当前栈中最后一个压入的元素位置。
-
链式栈
[栈顶元素 | 指针] -> [下一个元素 | 指针] -> ... -> [栈底元素 | 空指针]
结构容器
#include <iostream>
#include <stack>
int main()
{
std::stack<int> myStack;
std::cout << myStack.size() << std::endl;
std::cout << myStack.empty() << std::endl;
//入栈
myStack.push(1);
myStack.push(2);
myStack.push(3);
std::cout << myStack.size() << std::endl;
std::cout << myStack.empty() << std::endl;
//获取栈顶元素
std::cout << myStack.top() << std::endl;
//出栈
myStack.pop();
std::cout << myStack.top() << std::endl;
return 0;
}
结构设计
顺序栈
#include <iostream>
class Stack
{
public:
int* data; //栈的数组
int topIndex; //栈顶索引
int capacity; //栈的容量
public:
Stack(); //默认构造函数
Stack(int Size); //有参构造函数
Stack(const Stack& other); //拷贝构造函数
~Stack(); //默认析构函数
public:
void Push(int value); //入栈函数
void Pop(); //出栈函数
int Top(); //栈顶元素
public:
bool IsEmpty(); //是否为空
int Size(); //元素个数
};
Stack::Stack() : data(nullptr), topIndex(-1), capacity(0)
{
}
Stack::Stack(int Size) : topIndex(-1), capacity(Size)
{
this->data = new int[capacity] {};
}
Stack::Stack(const Stack& other) : data(new int[other.capacity]), topIndex(other.topIndex), capacity(other.capacity)
{
for (size_t i = 0; i < capacity; i++)
{
this->data[i] = other.data[i];
}
}
Stack::~Stack()
{
if (data != NULL)
{
delete[] data;
data = nullptr;
}
}
void Stack::Push(int value)
{
if (Size() == capacity)
{
//默认容量
int size = capacity;
//动态扩容
capacity = (capacity == 0) ? 5 : capacity * 2;
//申请内存
int* newData = new int[capacity] {};
//数据拷贝
memcpy(newData, this->data, size * sizeof(int));
//释放数据
if (this->data != NULL)
{
delete[] this->data;
}
//修正指向
this->data = newData;
}
data[++topIndex] = value;
}
void Stack::Pop()
{
if (IsEmpty())
{
return;
}
--topIndex;
}
int Stack::Top()
{
return this->data[topIndex];
}
bool Stack::IsEmpty()
{
return this->topIndex == -1 ? true : false;
}
int Stack::Size()
{
return topIndex + 1;
}
链式栈
class Node
{
public:
int value;
Node* Next;
Node(int Num) : value(Num), Next(nullptr) {}
};
class Stack
{
public:
Node* Head;
public:
Stack() : Head(nullptr)
{
}
Stack(const Stack& other)
{
if (other.Head == nullptr)
{
Head = nullptr;
}
else
{
Head = new Node(other.Head->value);
Node* head = Head;
Node* node = other.Head->Next;
while (node != nullptr)
{
head->Next = new Node(node->value);
head = head->Next;
node = node->Next;
}
}
}
~Stack()
{
Clear();
}
public:
void Push(int value)
{
Node* node = new Node(value);
node->Next = Head;
Head = node;
}
void Pop()
{
if (!IsEmpty())
{
Node* temp = Head;
Head = Head->Next;
delete temp;
}
}
int Top()
{
if (!IsEmpty())
{
return Head->value;
}
}
public:
bool IsEmpty()
{
return Head == nullptr;
}
void Clear()
{
while (!IsEmpty())
{
Pop();
}
}
};