【数据结构之栈和队列】

一.栈

1.1栈的基本概念

栈就是操作受限的线性表,只允许在一端进行插入和删除线性表。n个不同元素进栈,算出栈的可能可以根据卡特兰公式;

1.2栈的顺序存储

采用顺序存储的栈叫做顺序栈,定义如下:
#define maxsize 50
typedef struct {
elemtype data[maxsize];
int top;
}sqstack;
sqstack s;
初始时栈顶指针为-1;入栈操作:s.data[++s.top],
出栈操作:x=s.data[s.top–]; 栈空:s.top==-1;
栈满:s.top==maxsize-1;

利用栈底位置不变的特性,可以让两个顺序栈共享一个数组空间,称为共享栈。栈空则;s0.top=-1,s1.top=maxsize;
z栈满则:s1.top-s0.top==1;
共享栈是为了更好的利用存储空间,两个栈的空间相互调节,只有整个数组空间都被占满了才会发生上溢;

1.3栈的链式存储

采用链式存储的栈称为链栈。链栈的好处是只要内存中还有空间就不会产生溢出,便于多个栈共享存储空间,提高效率。
链栈通常采用单链表实现,且所有的操作都在表头进行操作;
可描述为:typedef struct linknode{
elemtype data;
struct linknode *next;
}**listack;
对于带头结点和不带头节点的操作会有不同;

二.队列

2.1队列的基本概念

队列也是一种操作受限的线性表,只允许在一段进行插入,另一端进行删除,先进去的元素也先出去即FIFO;

2.2队列的顺序存储

2.2.1一般的顺序对列

用数组实现队列的顺序存储,并设有两个指针,因为要在队尾插入,队头删除。队头指针front指向对头元素,队尾指针rear指向队尾的下一个元素(也可以有区别,看具体规定)定义为:
# define maxsize50;
typedef struct{
elemtype data【maxsize】;
int front,rear;
}sqqueue;
队空:s,fronts.rear;
队满:s.rear
maxsize ? 很明显是不行的,因为队头元素会删除掉,指针会动;
所以一般的顺序队列可能会有假溢出,针对这个缺点,引出循环队列的概念;

2.2.2循环队列

循环队列即把存储顺序队列的数组逻辑上看成一个环,称为循环队列,当指针来到maxsize-1以后,再前进一个位置就自动到0;这种方法用取余来实现:
初始时:s.front==s,rear==0;
队尾指针进1:s.rear=(s.rear+1)%maxsize;
对头指针进1:s.front=(s.front+1)%maxsize;
队列长度:(s,rear+maxsize-s,front)%maxsize;
判断条件:显然队空和队满都有:s.front==s.rear
所以无法区分,一般有三种解决方案:
1.牺牲掉一个存储单元,即最后剩的那个单元不存储。
这样队空:s.front==s.rear
队满:s.front==(s.rear+1)&maxsize;
2.在定义中增设一个表示元素个数的成员;
3.同样在定义中增设一个tag成员,以区分队满还是队空;

2.3队列的链式存储

队列的链式表示又叫链队列,他是一个同时带有头指针和尾指针的单链表,头指针指向队头节点,尾指针指向队尾节点。定义为:
typedef struct lnode{
elemtype data;
struct lnode next;
}linknode;
typedef sruct{
linknode front,rear
}linkqueue;
如果没有头节点;
队空:s,front==s,rear==null;
出队时,首先判断是否为空,如果不为空,则取出队头元素,并让q,front指向下一个节点,同时如果该节点是最后一个结点,则都需置为null;
入队时:插入节点,若原始为空,则q.front也指向这个节点。
所以没有头节点比较麻烦,所以通常将链队列设置为有头节点的情况;具体如下:
初始化:q.front=q,rear=(linknode
)malloc(sizeof(linknode));
q.front->next=null;
判空:q.front==q.rear;
入队:linknode s=(linknode
)malloc(sizeof(linknode));
s->data=x;
s->next=null;
rear-next=s;
rear=s;
出队:判断是否为空;
linknode *q=q.front->next;
x=q=>data;
q.front->next=q->next;
if(q==q.rear)
q.rear=q.front;
free(q);

2.3双端队列

一种特殊的队列,可以从两端插入和删除,同时还有输入受限的队列和输出受限的队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值