数据结构01 栈及其相关问题讲解

栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底"。

栈及其特点

用一个简单的例子来说,栈就像一个放乒乓球的圆筒,底部是封住的,如果你想拿出乒乓球,只能从顶部拿。同样的,如果你想再将乒乓球放回去,也只能从顶部放入其中。当然生活中还有很多这样的例子,再比如食堂中的一叠盘子,我们只能从顶端一个一个的取。放盘子也只能放在最上方。

总结栈的特点为:先入后出(Last In First Out->LIFO),即先入栈的元素要在之后入栈的元素取出来之后才能取出来。

STL模板中栈的基本使用

对于栈的使用,我们可以直接利用STL模板来实现,STL模板库中栈的基本操作如下:

头文件:#include<堆栈>

创建一个存放int类型数据的空栈s:stack<int> s;

s.empty(): 判断栈是否为空,为空返回true,否则返回false;

s.size(): 返回栈中元素的个数;

s.top(): 获取栈顶元素的值;

s.push(k): 向栈中添加新的元素k;

s.pop(): 删除栈s的栈顶元素。

s.push(k): 向栈中添加新的元素k;

s.pop(): 删除栈s的栈顶元素。

训练:逆波兰表达式

逆波兰表达式,又称后缀表达式,后缀表达式不包含括号,运算符(包括'+''-''*''/')放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将后缀表达式的结果计算出。

【输入描述】输入一个逆波兰表达式,字符之间用空格隔开

【输出描述】输出算式结果

【输入样例】2 1 + 3 *

【输出样例】9

参考程序

cpp 复制代码
#include<iostream>
#include<stack>
using namespace std;
int main(){
  int t,k;
  char c;
  stack<int> s;
  while(cin>>c){
        if(c>='0'&&c<='9')
            s.push(c-'0');  //是数字就入栈
        if(c=='+'){
            t=s.top(); //获取栈顶数字
            s.pop();   //出栈
            k=s.top(); //获取新的栈顶
            s.pop();     //出栈
            s.push(t+k);   //相加的和入栈
        }
        if(c=='-'){
            t=s.top();   //获取栈顶
            s.pop();     //出栈
            k=s.top();  //获取新的栈顶
            s.pop();     //出栈
            s.push(k-t); //相减结果入栈,注意顺序
        }
        if(c=='*'){
            t=s.top();
            s.pop();
            k=s.top();
            s.pop();
            s.push(t*k);   //相乘的积入栈
        }
        if(c=='/'){
            t=s.top();
            s.pop();
            k=s.top();
            s.pop();
            s.push(k/t); //相除结果入栈注意顺序
        }
    }
    cout<<s.top();
    return 0;
}

训练:括号匹配

给定一个字符串,里边可能包含"()"、"\[\]"、"{}"三种括号,请编写程序检查该字符串的括号是否匹配出现,匹配说明嵌套关系正确,例如 {()}() 是匹配的,而)({)}( 则不匹配。匹配则输出YES,否则输出NO。)

【输入描述】输入一个字符串 例如(1+2)/(0.5+1)

【输出描述】如果字符串匹配则输出YES,否则输出NO

【输入样例】(1+2)/(0.5+1)\*2

【输出样例】YES

参考程序

cpp 复制代码
#include <iostream>
#include <stack>
using namespace std;
int main(){
    stack<char> s;
    string a;
    cin>>a;
    for(int i=0;i<a.size();i++){
        if(a[i]=='('||a[i]=='['||a[i]=='{')  s.push(a[i]); //左括号入栈
        if(a[i]==')'){
            if(s.empty()) //右括号没匹配的就no
            {
                cout<<"NO"<<endl;
                return 0;
            }
            if(s.top()=='(')s.pop(); //右括号有匹配的则出栈
        }
        if(a[i]==']'){
            if(s.empty()) //右括号没匹配的就no
            {
                cout<<"NO"<<endl;
                return 0;
            }
            if(s.top()=='[') s.pop(); //右括号有匹配的则出栈
        }
        if(a[i]=='}'){
            if(s.empty()) //右括号没匹配的就no
            {
                cout<<"NO"<<endl;
                return 0;
            }
            if(s.top()=='{') s.pop(); //右括号有匹配的则出栈
        }
    }
    if(s.empty()) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}

从入门到算法,再到数据结构,查看全部文章请点击此处http://www.bigbigli.com/

相关推荐
云泽80831 分钟前
笔试算法 - 链表篇(一):移除、反转、合并、回文判断全解析
数据结构·c++·算法·链表
也曾看到过繁星32 分钟前
数据结构-复杂度
数据结构
菜菜的顾清寒32 分钟前
HOT力扣100(43)二叉树-翻转二叉树
数据结构·算法·leetcode
通信小呆呆33 分钟前
Toeplitz结构及其快速算法详解
算法
小poop34 分钟前
深入理解指针(中):数组与指针的进阶之旅
c++
YikNjy38 分钟前
break和continue
java·开发语言·算法
春日见39 分钟前
五分钟入门 强化学习---DQN(Deep Q Net)算法与实现
人工智能·python·深度学习·算法·microsoft·机器学习
budingxiaomoli1 小时前
动态规划--斐波那契数列模型
算法·动态规划
IT猿手1 小时前
多目标优化算法:多目标蛇优化算法(Multiple Objective Snake Optimizer,MOSO)(提供MATLAB代码)
开发语言·算法·matlab·动态路径规划·光伏模型参数估计
朔北之忘 Clancy1 小时前
2026 年 3 月青少年软编等考 C/C++ 一级真题解析
c语言·开发语言·c++·青少年编程·题解·考级