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/truereturn 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();
}