栈<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()

后缀表达式

洛谷P1449后缀表达式

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

如: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;
}

posted @ 2025-01-26 08:00  mc12356  阅读(22)  评论(0)    收藏  举报  来源