数据结构(4)

1、允许进行插入、删除操作的一端叫栈顶
2、表的另一端叫栈底
3、当栈中没有数据元素时称为空栈
4、插入叫进栈或入栈
5、删除叫退栈或出栈
特点:后进先出
顺序栈

typedef struct
{
ElemType data[maxsize];
int top;//栈顶指针
}SqStack;`

初始化栈

void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;}//s为栈指针,top为s所指栈的栈顶指针

销毁栈

void DestroyStack(SqStack *&s)
{
free(s);
}

判断栈是否为空

bool StackEmpty(SqStack *&s)
{
return s->top==-1);
}

进栈

bool push(SqStack *&s,ElemType e)
{
if(s->top==MaxSize-1)
return false;
s->top++;
s->data[s->top]=e;
return true;
}

出栈

bool pop(SqStack *&s,ElemType &e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;

取栈顶元素

bool GetTop(SqStack &*s,ElemType &e)
{
if(s->top==-1)
return false;//栈为空的情况,即栈下溢出
e=s->data[s->top];
return true;

链栈
采用链表存储的栈成为链栈,这里采用带头节点的单链表实现
链栈中数据节点的类型LiStack定义如下:

typedef struct linknode
{
ElemType data;//数据域
struct linknode *next;//指针域
}LiStack;

初始化栈

void initStack(LiStack *&s)
{
s=(LiStack *)malloc(sizeof(LiStack));
s->next=null;
}

销毁栈

void DestroyStack(LiStack *&s)
{
LiStack *p=s,*q=s->next;
while(q!=null)
{
free(p);
p=q;
q=p->next;
}
free(p);
}

判断栈是否为空StackEmpty(s)

bool StackEmpty(LiStack *s)
{
return(s->next==null);

进栈Push(&s,e)
将新数据节点插入到头节点之后(头插法)

void Push(LiStack *&s,ElemType e)
{
LiStack *p;
s=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=s->next;
s->next=p;
}

出栈Pop(&s,&e)

Pop(LiStack *&s,ElemType &e)
{
LiStack *p;
if(s->next==null)
return false;
p->next=s->next;
e=p->data;
s->next=p->next;
free(p);
}

取栈顶元素

bool GetTop(LiStack *s,ElemType &e)
{
if(s->next==null)
return false;
e=s->next->data;
return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值