栈
概念
栈(Stack) 是仅限在表尾进行插入和删除的 线性表,它遵循 后进先出(Last-In-First-Out,LIFO)的原则。栈可以类比为一叠盘子,你只能访问顶部的盘子,而添加或删除盘子只在顶部进行。
- 栈顶(Top) :线性表允许进行插入删除的那一端。
- 栈底(Bottom):固定的,不允许进行插入和删除。

在计算机科学中,栈 通常用于实现 函数调用、递归、表达式求值 等操作。我们一般可以用 顺序表 或者 链表 来实现栈。
栈的实现(C++)

引入库
#include<iostream>
#include<stdexcept>
using namespace std;
有入栈、出栈、获取栈顶元素、获取栈的数量。
定义模板类
template<typename T>是C++中的模板类型,可以套用任意类型。
template<typename T>
class Stack {
private:
T* data;
int size;
int capacity;
void resize();
public:
//析构函数
Stack() : data(new T[10]), size(0), capacity(10) {}
~Stack();
void push(T element);
T pop();
T top() const;
int getSize() const;
};
Stack内部定义了一个扩容函数属于私有,只可内部函数调用
template<typename T>
void Stack<T>::resize() {
int newCapacity = capacity * 2;
T* newData = new T[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
delete[] data;
data = newData;
capacity = newCapacity;
}
自动释放函数
template<typename T>
Stack<T>::~Stack() {
delete[] data;
}
一、入栈
- 概念
栈元素的插入操作叫做入栈,也可称为进栈、压栈。直接将元素添加到栈的顶部即可。这个操作类似将盘子添加到叠盘子的顶部。
- 步骤
- 将元素压入栈中,并将栈顶指针或索引指向新的栈顶元素。
- 栈的 Size 增加了 1 ,顶部元素为刚刚入栈的元素。
template<typename T>
void Stack<T>::push(T element) {
if (size == capacity) {
resize();
}
data[size++] = element;
}
二、出栈
- 概念
栈元素的删除操作叫做出栈,也可称为弹栈。直接将栈的顶部元素删除即可。这个操作类似于将叠盘子的顶部盘子拿走的过程。
- 步骤
- 将栈顶元素删除掉,并将栈顶指针或索引指向新的栈顶元素。
- 栈的 Size 减 1 。
template<typename T>
T Stack<T>::pop() {
if (size == 0) {
throw std::underflow_error("Stack is empty");
}
return data[--size];
}
三、获取栈顶元素
- 概念
返回栈顶元素的值,无论是链表还是顺序表,都可以通过栈顶指针在 O(1) 的时间复杂度获取到栈顶元素。
- 步骤
- 利用栈顶指针获取栈顶元素。
template<typename T>
T Stack<T>::top() const {
if (size == 0) {
throw std::underflow_error("Stack is empty");
}
return data[size - 1];
}
- 获取栈的大小
template<typename T>
int Stack<T>::getSize() const {
return size;
}
四、调试
int main() {
Stack<int> st;
st.push(4);
st.push(7);
st.push(10);
cout << st.top() << endl;
st.push(147);
cout << st.top() << endl;
st.pop();
st.pop();
cout << st.top() << endl;
cout << st.getSize() << endl;
return 0;
}
C++ STL 库 stack 的应用
- 头文件
#include<iostream>
#include<stack>
- 定义
stack<T>st;
----------------------------------------------
数据类型
>>>int float char string node(结构体)...
- 基本操作
s.empty() //栈空返回true,否则返回false
s.size() //返回栈中元素的个数
s.pop() //删除栈顶元素
s.top() //返回栈顶元素
s.push() //在栈顶压入新元素
总结及完整代码
这篇是看英雄哥自我学习C++代码,做的笔记记录下来,作为C++的学习和加深对数据结构的理解,和同学们一起分享,希望可以一起学习,考研必胜,栈是先进先出,持续更新中!!!加油!!!
#include<iostream>
#include<stdexcept>
using namespace std;
template<typename T>
class Stack {
private:
T* data;
int size;
int capacity;
void resize();
public:
Stack() : data(new T[10]), size(0), capacity(10) {}
~Stack();
void push(T element);
T pop();
T top() const;
int getSize() const;
};
template<typename T>
void Stack<T>::resize() {
int newCapacity = capacity * 2;
T* newData = new T[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
delete[] data;
data = newData;
capacity = newCapacity;
}
template<typename T>
Stack<T>::~Stack() {
delete[] data;
}
template<typename T>
void Stack<T>::push(T element) {
if (size == capacity) {
resize();
}
data[size++] = element;
}
template<typename T>
T Stack<T>::pop() {
if (size == 0) {
throw std::underflow_error("Stack is empty");
}
return data[--size];
}
template<typename T>
T Stack<T>::top() const {
if (size == 0) {
throw std::underflow_error("Stack is empty");
}
return data[size - 1];
}
template<typename T>
int Stack<T>::getSize() const {
return size;
}
int main() {
Stack<int> st;
st.push(4);
st.push(7);
st.push(10);
cout << st.top() << endl;
st.push(147);
cout << st.top() << endl;
st.pop();
st.pop();
cout << st.top() << endl;
cout << st.getSize() << endl;
return 0;
}
&spm=1001.2101.3001.5002&articleId=146390948&d=1&t=3&u=5782f57b6d004439a74dedf5fd6d4bba)
6371

被折叠的 条评论
为什么被折叠?



