数据结构学习ing

文章介绍了双链表的初始化方法,以及在特定位置插入、删除节点的操作。同时,还展示了如何使用C++实现栈和队列的基本操作,以及一个用于解决单调栈问题的示例代码。
摘要由CSDN通过智能技术生成

双链表问题

初始化

简单的把1当成tail,0当成head

void init(){
    l[1]=0,r[0]=1;
    idx=2;
}

在第k个点右边插入一个x

void add(int k,int x){
    //1.先在e[]里面添加x
    e[idx]=x;
    //2.创建结点
    l[idx]=k;
    r[idx]=r[k];
    //3.添加边
    l[r[k]]=idx;
    r[k]=idx;
    //4.
    idx++;
}
//左边的话
// void add(int l[k],int x)

删除k个点

void remove(int k){
    r[l[k]]=r[k];
    l[r[k]]=l[k];
}

当然在实际main函数里,记得k+1;

栈与队列

模拟栈、队列

栈 先进后出

#include<iostream>
using namespace std;
const int N=100010;
int st[N];
int top=-1;
int n;
int main(){
    cin>>n;
    while(n--){
        string s;
        cin>>s;
        if(s=="push"){
            int a;
            cin>>a;
            st[++top]=a;
        }
        if(s=="pop"){
            top--;
        }
        if(s=="query"){
            cout<<st[top]<<endl;
        }
        if(s=="empty"){
            cout<<(top==-1?"YES":"NO")<<endl;
        }
    }
    return 0;
}

队列 先进先出

//head=0,tail=-1
void push(int x){
    //此处必须队尾先往后移动一格
    q[++tail]=x;
}
void pop(){
    head++;
}
void empty(){
    if(tail>=head) cout<<"NO"<<endl;
    else cout<<"YES"<<endl;
}
void query(){
    cout<<q[head]<<endl;
}

单调栈

#include<iostream>
#include<stack>
#include<vector>
using namespace std;
vector<int> getBiggerInt(vector<int> t){
    stack<int> temp;
    vector<int> ans(t.size(),-1);
    for(int i=0;i<t.size();i++){
        if(i==0) {
            ans.push_back(-1);
            temp.push(t[0]);
        }
        else{
            if(t[i]>temp.top()){
                ans[i]=temp.top();
            }
            else{
                ans[i]=-1;
                temp.push(t[i]);
            }
        }  //超时了。。。

    }
    return ans;
}
// int main(){
//     int m;
//     scanf("%d",&m);
//     vector<int> t(m);
//     for(int i=0;i<m;i++){
//         scanf("%d",&t[i]);
//     }
//     vector<int> ans=getBiggerInt(t);
//      for(int i=0;i<m;i++){
//        printf("%d ", ans[i]);
//     }
//     return 0;

// }
int main(){
    int m;
    cin>>m;
    int top=0;
    vector<int> ans(m,-1);
    while(m--){
        int x;
        scanf("%d",&x);
        while(top && ans[top]>=x) top--;
        if(!top) printf("-1 ");
        else printf("%d ",ans[top]);
        ans[++top]=x;

    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值