1.概念
栈是一种后进先出(Last In, First Out,LIFO)的数据结构,这意味着最后加入栈的元素最先被移除。我们可以将栈想象成一个垂直的容器,像是一叠盘子,新的盘子总是放在最上面,取盘子时也是从最上面的开始。
2.栈的基本操作
- 入栈(Push):将元素压入栈顶。
- 出栈(Pop):将栈顶元素移除并返回。
- 窥视(Peek 或 Top):返回栈顶元素但不移除它。
- 判空(IsEmpty):检查栈是否为空。
3.简单实现
template<class T, class Container = vector<T>>
class Stack
{
public:
Stack() {}
size_t size(){return s.size();}
bool empty() {return s.empty();}
void push(const T& x = T()) {s.push_back(x);}
void pop(){return s.pop_back();}
T& top() {return s.back();}
const T& top() const{return s.back();}
private:
Container s;
};
4.使用场景
栈在许多算法和计算中都扮演着关键角色,以下是一些常见的应用场景:
- 表达式求值:包括中缀表达式转换为后缀表达式,以及后缀表达式求值。
- 括号匹配:用于检查表达式中的括号是否成对匹配。
- 函数调用栈:在程序运行时,用于存储函数调用信息,实现递归。
- 浏览器的前进后退功能:通过两个栈来实现浏览历史的前进和后退。
- 后退操作:当用户点击后退按钮时,当前页面被压入前进栈,从后退栈弹出一个页面并显示。
- 前进操作:当用户点击前进按钮时,当前页面被压入后退栈,从前进栈弹出一个页面并显示。
- 新页面加载:当用户访问一个新页面时,清空前进栈,并将当前页面压入后退栈。