栈<stack>
在 C++ 中,栈(Stack)是一种重要的数据结构,栈是一种特殊的线性表,它只能在一端进行插入和删除操作,这一端被称为栈顶(Top),另一端则称为栈底(Bottom)。栈遵循后进先出(Last In First Out,LIFO)的原则,就像一摞盘子,最后放上去的盘子会最先被取下来。
栈的基础
相关操作
- 入栈(Push):将元素添加到栈顶的操作。例如,在一个整数栈中,执行 push (5) 操作,就是将数字 5 添加到栈顶。
- 出栈(Pop):移除栈顶元素的操作。执行 pop () 操作后,栈顶元素被删除,栈的大小(size)减 1。
- 获取栈顶元素(Top):可以通过 top () 函数获取栈顶元素的值,但并不删除该元素。
- 判断栈是否为空(Empty):使用 empty () 函数来检查栈是否为空,如果栈中没有任何元素,返回 true(1),否则返回 false(0)。
- 获取栈的大小(Size):通过 size () 函数可以获取栈中元素的数量(大小)。
c++可以使用头文件<stack>使用栈,当然也可以自己模拟但是很麻烦。
#include <iostream>
#include <stack>
using namespace std;// 使用标准命名空间
int main() {
stack<int> myStack; // 创建一个存储整数的栈
myStack.push(10);// 入栈操作:向栈中添加元素
myStack.push(20);
myStack.push(30);
cout << "栈的大小: " << myStack.size() << endl;
if (!myStack.empty()) {cout << "栈顶元素: " << myStack.top() << endl;}
myStack.pop();// 出栈操作:移除栈顶元素
cout << "\n执行出栈操作后:" << endl;// 再次输出栈的状态
cout << "栈的大小: " << myStack.size() << endl;
if (!myStack.empty()) {cout << "栈顶元素: " << myStack.top() << endl;}
// 持续出栈直到栈为空
while (!myStack.empty()) {myStack.pop();}
cout << "\n多次出栈后,栈是否为空: " << (myStack.empty() ? "是" : "否") << endl;
return 0;
}
<vector>和<string>都有类似于栈的这种操作
| 栈的核心操作 | vector 实现方式 | string 实现方式 |
|---|---|---|
| 入栈(尾部加元素) | push_back(const T& val) | push_back(char c) / operator+=(char c) |
| 出栈(尾部删元素) | pop_back() | pop_back() |
| 取栈顶(访问尾部) | back()(返回尾部元素引用) | back()(返回尾部字符引用) |
| 判空 | empty() | empty() |
| 栈大小 | size() | size() |
后缀表达式
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5-2)+7 对应的后缀表达式为:3 5 2 - * 7 + ,对于运算符操作比如a + b,b是当前栈顶,a是栈顶下面一个。可以理解为栈弹出两个元素,再压入运算结果
3 5 2 - * 7 + ,3入栈,5入栈,2入栈。检测到运算符-,栈顶变为5 -2 = 3.
#include<iostream>
#include<stack>
using namespace std;
int main() {
char c[100];
stack<int> st;
int n=0;
fgets(c,100,stdin);
for(int i=0;c[i]!='@';i++) {
if(c[i]>='0' && c[i]<='9') {n=c[i]-'0'+n*10;continue;}
else if(c[i]=='.') {st.push(n);n=0;continue;}
n=st.top();
st.pop();
if(c[i]=='-'){n=st.top()-n;}
else if(c[i]=='/'){n=st.top()/n;}
else if(c[i]=='*'){n=st.top()*n;}
else if(c[i]=='+'){n=st.top()+n;}
st.pop();
st.push(n);
n=0;
}
cout<<st.top()<<endl;
}

浙公网安备 33010602011771号