Skip to content

stack,栈,是 一种先进后出的数据结构,他只有一个出口。

  • 栈的图解

image.png

  • 基本语法
    stack<typename> name;

    需要加上头文件 stack

例如:

c
//表示创建一个int类型的栈,名字叫做stk
stack<int> stk;

栈的常用函数

  • push()
    stack_name.push(x) 将x入栈,时间复杂度为O(1)。
push() 示例代码
c
    stack<int> stk;
	stk.push(10); // 放数值10进栈
	stk.push(20); // 放数值20进栈
	stk.push(30); // 放数值30进栈

分析

此时,栈里的元素,从栈顶部往下,元素依次是 10,20,30; 图解如下:
image.png

  • top()
    stack_name.top() 获得栈顶元素,时间复杂度为O(1)。
top() 示例代码
cpp
#include<bits/stdc++.h>
#include<stack>
using namespace std;
int main()
{
    stack<int> stk;
	stk.push(10);
	stk.push(20);
	stk.push(30);
	cout << "栈顶元素是:" << stk.top() << endl;
    return 0;
}

运行结果:

c
栈顶元素是:30
  • pop()
    stack_name.pop() 可以弹出栈顶元素,时间复杂度为O(1)。
pop() 示例代码
cpp
#include<bits/stdc++.h>
#include<stack>
using namespace std;
int main()
{
    stack<int> stk;
	stk.push(10);
	stk.push(20);
	stk.push(30);
	cout << "栈顶元素是:" << stk.top() << endl;
	stk.pop();
	cout << "栈顶元素是:" << stk.top() << endl;
    return 0;
}

运行结果:

c
栈顶元素是:30
栈顶元素是:20

分析

通过 pop 函数,栈内的 30 就弹出去了,此时栈顶是数组 20,再次验证栈的插入删除是从一端进行的;

  • empty()
    satck_name.empty() 可以检测stack内是否为空,返回true为空,返回false为非空,时间复杂度为O(1)。
empty() 示例代码
cpp
#include<bits/stdc++.h>
#include<stack>
using namespace std;
int main()
{
    stack<int> stk;
	stk.push(10);
	stk.push(20);
	stk.push(30);
	if(stk.empty())
	{
		cout << "栈内是空的" << endl;
	}else{
		cout << "栈内有元素" << endl;
	}
    return 0;
}

运行结果:

c
栈内有元素

分析

此时栈内部从顶部往下,分别有元素 30,20,10,所以 empty 函数不成立,执行 else 部分,打印"栈内有元素"。

  • size()
    stack_name.size() 返回stack内元素的个数,时间复杂度为O(1)。
size 示例代码
cpp
#include<bits/stdc++.h>
#include<stack>
using namespace std;
int main()
{
    stack<int> stk;
	stk.push(10);
	stk.push(20);
	stk.push(30);
	cout << "栈内元素个数是:" << stk.size() << endl;
    return 0;
}

运行结果:

c
栈内元素个数是:3

分析

此时栈内部从顶部往下,分别有元素 30,20,10,所以一共是 3 个元素。

栈的小练习