0
点赞
收藏
分享

微信扫一扫

栈的链式存储与数组模拟

洛茄 2022-01-26 阅读 64

目录

链式存储(链栈)

node

其实就是个单链表,每个单位包括自身的数据< Data >与下一个结点的指针 < Next >,但插入与删除操作只能在栈顶实现
Next指向临近该元素的<靠栈底的元素>
//Stack表示整个栈的指针,<栈的指针>的Next始终指向栈顶元素

typedef struct Snode *Stack;
Snode{
	data;
	Snode Stack;
};

操作

1.建栈(创建头结点)

Stack init()//创建头结点,返回该指针,指向整个栈的指针的Next始终指向栈顶
{
    Stack S;
    S=(Stack)malloc(sizeof(Snode));
    return S;
}

2.检查栈是否为空

bool isempty(Stack S)
{
    return S->Next==NULL;
}

3.在栈顶压入一个元素

void push(int x,Stack S)
{
    Snode *p;
    p=(Snode *)malloc(sizeof(Snode));
    p->data=x;
    p->Next=S->Next;//<新插入的元素>的Next是离它最近的<靠栈底的元素>
    S->Next=p;//S的Next再次指向栈顶
}

4.删除并返回栈顶元素

int pop(Stack S)//删除并返回栈顶元素
{
    Snode *fr;//后面用于释放被删除的内存
    int top;//后面用于返回栈顶元素
    if(isempty(S)){
        cout<<"空栈"<<endl;
        return NULL;
    }

    else {
        fr=S->Next;//也就是栈顶
        S->Next=fr->Next;//S的Next要一直指着栈顶,删完fr,栈顶就是fr的下一个元素
        top=fr->data;
        free(fr);
        return top;
    }
}

数组模拟栈

过于简单…直接上码(acwing 828.)
//tt表示栈顶下标

#include<bits/stdc++.h>
using namespace std;
int m,tt,stk[100005];
string s;
int main()
{
    ios::sync_with_stdio(false);
    int x;
    cin>>m;
    while(m--){
        cin>>s;
        if(s=="push"){
            cin>>x;
            stk[++tt]=x;
        }
        else if(s=="pop"){
            tt--;
        }
        else if(s=="empty"){
            if(tt==0)cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        else{
            cout<<stk[tt]<<endl;
        }
    }
    return 0;
}
举报

相关推荐

0 条评论