目录
链式存储(链栈)
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;
}