数据结构栈和队列

文章介绍了栈和队列这两种基础数据结构,包括它们的形象解释、基本操作如入栈、出栈、入队、出队,并展示了如何在C++中使用结构体和STL模板库实现这些操作。此外,还通过例题演示了栈和队列的实际应用,例如字符串括号匹配和序列操作。
摘要由CSDN通过智能技术生成

一、栈

1,概念理解

形象地说,栈就好比一个桶,可以往里面方东西,但只能一层一层放。也可以拿走桶里的东西,但只能先拿走最上面的,才能拿到下面的东西。

元素入栈(如下)

元素出栈(如下)

抽象地说,栈就是一种元素先进后出的数据结构。

2,操作

定义结构体,。

const int N=1e5+7;//假设数据量不会超过N

struct stack{
    int arr[N],top;
    stack(){
        top=-1;//初始化栈为空
    }
};

判空 

bool empty(stack& s)
{
    return s.top==-1?true:false;//如果栈顶为-1,表示现在栈内无元素    
}

入栈

void push(stack &s,int d)
{
    s.arr[++s.top]=d;//先将栈顶+1,再放入元素
}

出栈

void pop(stack &s)
{
    if(!s.empty())s.top--;//如果栈非空,那么栈顶-1;
    //虽然原数据还在数组里,但是无论是访问还是增加元素都不会受它影响
}

取得栈顶元素

int top(stack &)
{
    if(!s.empty())return s.arr[s.top];
    return -1;//假设-1为非法数据
}

返回大小

int size(stack &s)
{
    return s.top+1;//此处栈下标从0开始
}

3STL模板库

在C++中提供了标准模板库,可以直接使用栈模板,只需增加头文件,所以以上代码不需要我们书写,只需理解内部大概的流程和结构及实现过程

#include<iostream>
#include<stack>
using namespace std;



int main()
{
    stack<int>st;
    st.empty();//判空,若空返回真
    st.pop();//弹出元素
    st.push(5);//增加元素
    st.size();//返回大小
    st.top();//返回栈顶元素
}

4,例题演示

luoguP1739

思路:遍历字符串,若遇到‘(’,则入栈,否则出栈。若无法出栈或最后栈的大小大于0,说明不匹配,用flag记录一下。

#include<iostream>
#include<stack>
#include<string>
using namespace std;

int main()
{
    stack<char>st;
    string s;
    cin>>s;
    bool flag=true;//假设字符串合法
    for(int i=0;i<s.length()&&flag;i++)
    {
        if(s[i]=='@')break;
        if(s[i]=='(')st.push('(');
        if(s[i]==')')
        {
            if(!st.empty())st.pop();
            else flag=false;
        }
    }
    if(st.size()>0)flag=false;
    if(flag)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

二、队列

1,概念理解

形象地说,好比生活中大家排队买东西,先到的先买,先到先得。

入队

出队

抽象地说,队列就是一种元素先进先出的数据结构。

2,操作

定义结构体

const int N=1e5+7;

struct queue
{
    int arr[N];//假设数据量不超过N
    int l,r;
    queue()
    {
        l=0,r=-1;//l代表队头下标,r代表队尾下标
    }
};

判空

bool empty(queue &q)
{
    return q.l>q.r;
}

入队

void push(queue &q,int d)
{
    q.arr[++q.r]=d;
}

出队

void pop(queue &q)
{
    if(!empty(q))q.l++;
}

取得队头元素

int front(queue &q)
{
    if(!empty(q))return q.arr[q.l];
    else return -1;
}

取得队尾元素

int back(queue &q)
{
    if(!empty(q))return q.arr[q.r];
    else return -1;
}

返回大小

int size(queue &q)
{
    return q.r-q.l+1;
}

3STL模板库

#include<iostream>
using namespace std;
#include<queue>

int main()
{
    queue<int>que;
    que.back();
    que.empty();
    que.front();
    que.pop();
    que.push(1);
    que.size();
}

4,例题演示

luoguP1996

思路:用队列直接模拟

#include<iostream>
using namespace std;
#include<queue>


int main()
{
    
    queue<int>que;
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        que.push(i);
    }
    int num=0;
    while(que.size())
    {
        num++;
        if(num==m)
        {
            cout<<que.front()<<' ';
            num=0;
            que.pop();
        }
        else
        {
            que.push(que.front());
            que.pop();
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值