数据集合从一端插入以及删除,满足 后进先出(Last in First out)的特性,栈只有两个操作,入栈(push)和出栈(pop),在实现形式上有依托数组实现的顺序栈与依托链表实现的链式栈
栈的复杂度分析
- 入栈:栈的入栈操作只是在数据末尾添加数据,在未达到边界条件下是以直接插入的形式进行,没有数组的随机访问的特性,因此入栈的时间复杂度为O(1)
- 出栈:栈的弹出只能由结构中的尾部直接弹出删除,并不能从中间或者头部实现弹出操作,因此出栈的时间复杂度也为O(1)
- 还有一种栈支持动态扩容,假设容量capcity为N,那么在边界情况N-1下,动态扩容至2倍,此时需要额外申请内存空间,然后进行数据复制搬移,因此此时边界条件下入栈的时间复杂度变为O(n),然后在剩下的N-1的数据入栈下时间复杂度又变为O(1),依据平均时间复杂度的摊还分析法可以得知,扩容复制的那一次的O(n)的时间复杂度在剩余的N-1次入栈条件下,平均时间复杂度依旧为O(1)。
顺序栈的C++实现
#pragma once
class Stack
{
private:
int capcity;//栈的最大容量
int size; //当前栈中数据个数
int* array; //数组空间
public:
Stack(int n = 0);
//析构掉申请的数组空间
~Stack();
//栈为满
bool IsFull();
//栈为空
bool IsEmpty();
//获取当前个数
int GetSize();
//获取当前栈的最大容量
int GetCapcity();
//入栈
bool Push(int elem);
//出栈并返回出栈数据
int Pop();
//清空栈内所有数据
void Clear();
};
#include"stack.h"
#include<iostream>
using std::cout;
using std::endl;
Stack::Stack(int n)
{
capcity = n;
size = 0;
array = new int[capcity];
}
Stack::~Stack()
{
delete[]array;
}
bool Stack::IsFull()
{
if (size == capcity && capcity)
return true;
return false;
}
bool Stack::IsEmpty()
{
if (capcity && size == <