Linux编程预习 - 栈与队列

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

栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。反之,像数组等,因为要分散精力去考虑数组的下标增减等细节问题,反而掩盖了问题的本质。

3.栈的逻辑结构和存储表示
栈的逻辑结构和线性表相同。
栈的抽象数据类型有两种典型的存储表示:基于数组的存储表示和基于链表的存储表示。 
(1)基于数组的存储表示实现的栈称为顺序栈,顺序栈可以采用顺序表作为其存储表示,因此,可以在顺序栈的声明中用顺序表定义它的存储空间。 
(2)基于链表的存储表示实现的栈称为链式栈,链式栈可以采用单链表作为其存储表示,因此,可以在链式栈的声明中用单链表定义它的存储空间。
 
4.栈的注意点

首先它是一个线性表,也就是说,栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。定义中说是在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。它的特殊之处就在于限制了这个线性表的插入和删除位置,它始终只在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。 
栈的插入操作,叫作进栈,也称压栈、入栈。 
栈的删除操作,叫作出栈,也有的叫作弹栈。


5.栈的基本运算有:
1) initstack(s),构造一个空栈;
2) stackempty(s),判栈空;
3) stackfull(s),判栈满;
4) push(s,x),进栈;
5) pop (s),退栈;
6) stacktop(s),取栈顶元素。
 
6.栈的“上溢”和“下溢”
当栈满时,做进栈运算必定产生空间溢出,称“上溢”。 当栈空时,做退栈运算必定产生空间溢出,称“下溢”。上溢是一种错误应设法避免,下溢常用作程序控制转移的条件。

7.在顺序栈上的基本运算:
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];
}
 
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;
}
 
9.队列的定义
队列是一种运算受限的线性表,允许删除的一端称队首,允许插入的一端称队尾。队列又称为先进先出线性表,FIFO表。
 
10 如何解决顺序存储的弊端

对于栈来说,如果是两个相同数据类型的栈,则可以用数组的两端作栈底的方法来让两个栈共享数据,这就可以最大化地利用数组的空间。 
对于队列来说,为了避免数组插人和删除时需要移动数据,于是就引入了循环队列,使得队头和队尾可以在数组中循环变化。解决了移动数据的时间损耗,使得本来插入和删除是O(n)的时间复杂度变成了O(1)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值