【普及】数据结构 - 栈(stack)

1. 定义

堆栈又名栈($stack$),它是一种运算受限的线性表。

限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。

  • 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;

  • 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2. 代码

(1) 数组模拟——速度更快

①定义
int a[N], head = 0, end = 0;	//定义一个整型栈,此时头指针与尾指针均指向0,代表该栈为空
//head 为栈底指针、end 为栈顶指针
②入栈
void push(int x){
    end ++;	//尾指针后移一位
    a[end] = x;	//将x入栈
}
③出栈
void pop(){
    end --;	//尾指针前移一位
}
④返回栈顶元素
int top(){
    return a[end];	//返回栈顶元素
}
⑤返回栈中元素个数(栈的长度)
int size(){
    return end - head;	//尾指针减头指针即为栈的长度
}
⑥判断栈是否为空
bool empty(){
    if(end == head)	return true;	//头指针和尾指针相等,该栈为空,返回 真/1/true
    return false;	//否则头指针和尾指针不相等,该栈不为空,返回 假/0/false
}
⑦遍历栈
int a[N], head = 0, end = 0;
for(int i = 1; i <= n; i ++){	//入栈
    int x;
    cin >> x;
    push(x);
}
while(!empty()){	//方案1.出栈
    cout << top();
    pop();
}
while(size()){	//方案2.出栈
    cout << top();
    pop();
}
⑧返回栈中第 $i$ 个元素(数组模拟特有功能)
int stack_i(int i){
    return a[i];	//数组模拟栈的优势在于可以通过数组下标,在 O(1) 的时间里,找到第 i 个元素
}

(2) $STL$模板

①定义
#include<stack>	//引用 stack 头文件
stack<int> a;	//定义一个整型栈
stack<string> s;	//定义一个字符串栈
stack<node> b;	//定义一个结构体栈
②入栈
a.push(x);
③出栈
a.pop();
④返回栈顶元素
int x = a.top();
⑤返回栈中元素个数(栈的长度)
int len = a.size();
⑥判断栈是否为空
bool b = a.empty();
⑦遍历栈
stack<int> a;
for (int i = 1; i <= n; i ++)	a.push(i);	//入栈
while(!a.empty()){	//方案1.出栈
	cout << a.top() << "\n";	//栈顶元素
	a.pop();
}
while(a.size()){	//方案2.出栈
	cout << a.top() << "\n";	//栈顶元素
	a.pop();
}
posted @   步履不停的赤子  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示