1.栈的定义

栈是限制仅在表的一端进行插入和删除运算的线性表又称为后进先出表(LIFO表)插入、删除端称为栈顶,另一端称栈底。表中无元素称空栈。

 

栈的逻辑结构和存储表示

栈的逻辑结构和线性表相同。

栈的抽象数据类型有两种典型的存储表示:基于数组的存储表示和基于链表的存储表示。 
(1)基于数组的存储表示实现的栈称为顺序栈,顺序栈可以采用顺序表作为其存储表示,因此,可以在顺序栈的声明中用顺序表定义它的存储空间。 
(2)基于链表的存储表示实现的栈称为链式栈,链式栈可以采用单链表作为其存储表示,因此,可以在链式栈的声明中用单链表定义它的存储空间。

 

3.栈的基本运算有:

1) initstack(s),构造一个空栈;

2) stackempty(s),判栈空;

3) stackfull(s),判栈满;

4) push(s,x),进栈;

5) pop (s),退栈;

6) stacktop(s),取栈顶元素。

 

4.顺序栈的定义

栈的顺序存储结构称顺序栈。

 

5.栈的“上溢”“下溢”

当栈满时,做进栈运算必定产生空间溢出,称“上溢”。 当栈空时,做退栈运算必定产生空间溢出,称“下溢”。上溢是一种错误应设法避免,下溢常用作程序控制转移的条件。


6.在顺序栈上的基本运算:

1) 置空栈。

Void initstack(seqstack *s)

{

 s->top=-1;

}

2)判栈空。

int stackempty(seqstack *s)

{

 return s->top==-1;

}

3)判栈满。

int stackfull(seqstack *s)

{

 return s->top==stacksize-1;

}

4)进栈。

Void push(seqstack *s,datatype x)

{

 if(stackfull(s))

  error(stack overflow);

 s->data[++s->top]=x;

}

5)退栈。

Datatype pop(seqstack *s)

{

 if(stackempty(s))

  error(stack underflow);

 return S->data[s->top--];

}

6)取栈顶元素。

Dtatatype stacktop(seqstack *s)

{

 if(stackempty(s))

  error(stack underflow);

 return S->data[s->top];

}

 

7.链栈的定义

栈的链式存储结构称链栈。栈顶指针是链表的头指针。

 

8.链栈上的基本运算:

1) 建栈。

Void initstack(linkstack *s)

{

 s->top=NULL;

}

2)判栈空。

Int stackempty (linkstack *s)

{

 return s->top==NULL;

}

3) 进栈。

Void push(linkstack *s,datatype x)

{

 stacknode *p=(stacknode *)malloc(sizeof(stacknode));

 p->data=x;

 p->next=s->top;

 s->top=p;

}

4) 退栈。

Datatype pop(linksatck *s)

{

 datatype x;

 stacknode *p=s->top;

 if(stackempty(s))

  error(stack underflow);

 x=p->data;

 s->top=p->next;

 free(p);

 return x;

}

5) 取栈顶元素。

Datatype stacktop(linkstack *s)

{

 if(stackempty(s))

  error(stack is empty);

 return s->top->data;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值