数据结构 - 栈

栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和线性表大不相同的两类重要的的抽象数据类型。

栈的定义

栈(stack) 是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。

栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为 入栈,在栈顶删除元素称为出栈

栈的使用

1.手写栈

代码实现:

#include<iostream>
using namespace std;
const int N=1e7;
struct stack {
    int a[N];//声明数组模拟栈
    int tt=0;//tt代表栈顶位置 
    bool empty() {//判断栈是否为空 
        return (tt)?0:1;//不为空返回1,否则返回0 
    } 
    void insert(int n) {//插入元素 
        a[tt++]=n;//将tt设为加入的元素 
    }
    int front() {//返回栈顶 
        return tt?a[tt-1]:-1;//如果栈不为空,返回a[tt-1],否则返回-1表示栈空 
    }
    void pop() {//删除操作 

        if(tt) --tt;//在栈不空的情况下直接将栈顶位置减一 
    }
   int size() {
      return tt;
   }
} s;
int main() {//检查代码是否写错的方法 
    s.insert(1);//插入元素1 
    printf("%d %d %d\n",s.empty(),s.front(),s.size()); //输出s是否为空和s的顶元素 
    s.pop();//删除插入的元素 
    printf("%d %d %d\n",s.empty(),s.front(),s.size()); //再次输出s是否为空和s的顶元素 
    return 0;
} 

在实现插入、输出、判空、返回元素个数、返回栈顶四个操作后,可以添加自己想要的操作(你自己发挥,这个我管不着)

比如:

void clear() {
    tt = 0;
}

2.STL_stack (懒人的法宝)

使用 C++ 的 STL 库中的 stack 容器,可以非常容易的使用栈。

应先添加头文件 #include <stack>,头文件下面加上 using namespace std;,就可以使用了。

常用操作

push(x):将 x 入栈,时间复杂度为 O(1)O(1);

top():获得栈顶元素,时间复杂度为 O(1)O(1);

pop():弹出栈顶元素,时间复杂度为 O(1)O(1);

empty():检测栈内是否为空,时间复杂度为 O(1)O(1)。

size():返回 stack 内元素的个数,时间复杂度为 O(1)O(1)。

#include <cstdio>
#include <stack>
using namespace std;
int main() {
    stack<int> stk;
    for (int i = 1; i <= 5; ++i) 
        stk.push(i);// 将 i 逐个入栈
    printf("%d\n", stk.top());//已知栈非空,获取栈顶元素
    return 0;
}
 
posted @ 2022-07-13 09:16  abensyl  阅读(0)  评论(0)    收藏  举报  来源
//雪花飘落效果