目录
结构特性
结构实现
结构容器
结构设计
顺序栈
链式栈
结构特性
-
栈(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();}}};