您的位置:首页 > 其它

0520学习总结(栈,链栈,队列)

2017-07-07 19:40 155 查看
栈:
1.概念:这里说的是指数据结构里面的栈,和内存分配的占空间是区别开来的

2.模型
后进先出 或 先进后出

3.线性表

4.操作
1.初始化一个栈
2.判断栈是否为空
3.判断栈是否满
4.入栈(push)
5.出栈(pop)
6.取栈顶

链栈:
1、什么是链栈:
栈的链式存储!与其说是“栈的链式存储”不如说是“链表的栈式操作”!

   
2、为什么引入链栈:
  数组:一旦定义了大小就很难改变;
  链表:解决数组上面的缺陷;
  栈:在编程里面本质上是对数组进行操作,也就是用数组来存储,只不过操作方式只能够从数组最大的下标操作;===》也会有大小的限制!溢出;
  链栈:为了解决栈空间大小的限制!

   
3、栈的链式存储的结构模型;

4、链表的栈式操作的具体操作:
1、结点类型:
//每一个结点的类型;
struct node
{
int data;
//保存的数据;
struct node *pNext;
//指向的下一个结点的地址;
};

2、指向结点的类型的定义:
struct Stack
{
struct node *top;
//保存的是一个结点的地址;
};

具体操作:
1、初始化一个链表:
其实也就是定义一个不带头结点的链表:也就是指向的是NULL;
void init_stack(struct Stack *s)
{
s->top = NULL;
}
2、判断一下链表是否为空:int empty_stack(struct Stack *s)
{
if(s->top == NULL)
{
return STACK_EMPTY;
}
return STACK_NOEMPTY;
}

3、判断是否为满:不需要判断!

4、链表增加结点:
伪代码:
1、申请一个结点大小的堆空间;
2、判断一下申请的堆空间是否成功;
3、给申请的结点赋值;
4、将新申请的结点指向链表原来的第一个结点;
5、将top指向新申请的结点;

5、链表删除结点:
伪代码:
1、判断链表是否为空:
2、将s->top指向链表原来第一个结点的下一个;
3、将链表原来的第一个结点删除;

总结:
链表的栈式操作:
1、操作方式是栈式操作:只能够在一端进行插入或者删除;
2、和栈的顺序存储方式不同的地方:大小不受限制,可以不限制增加,如果不行的话,计算机内存不够就奔溃;
3、为什么称为栈的链式存储?
其实在这里面每一个结点就相当于数组中的一个元素(a[1] a[3]),因为数组中的元素分配是挨着的,链表中的结点分配地址不是挨着的,
所以就需要定义一个结构体类型的指针变量保存下一个结点的地址吧!
栈的顺序存储中是用数组,数组里面是一个一个紧挨着的元素;
栈的链式存储其实也是数组,数组中的元素是一个一个的结点,就需要在一个结点里面保存另外一个结点的地址,这样就构成了锁链,也就是链表,也就是栈的链式存储!

其实栈的链式存储,或者称为链表的栈式操作,跟链表的头插和头部删除是一样的!

队列:
模型和概念跟我们现实生活中的“排队”是一个道理!
引入:
队头指针:front;
队尾指针:rear;
开辟一段空间用来保存队列:用数组来表示!int queue[10];
//表示的是这个队列只能够保存10个元素!
front和rear都表示的是数组的下标!

1、初始化一个空队列:
front = -1;
rear = -1;

2、 判断队列是否为空:
无论是刚初始化的空队列还是经过了进队和出队的操作导致的空队列,有一个特点:front = rear

int empty_queue()
{
if(front == rear)
{
printf("The queue is empty!\n");
return QUEUE_EMPTY;
}
return QUEUE_NOEMPTY;
}
3、判断队列是否满:
queue[10]:抛开前面位置是否填充数据不看!queue[9]有数据的话==》队列满!

4、入队列:
伪代码:
判断一下队列是否满!
比如queue[4]位置有存储数据,接下来要是再入队,就要存储到queue[5]===》
1、rear++;
2、将数据放到queue[rear]里面!

5、出队列:
伪代码:
1、判断队列是否为空;
2、front++;
3、将queue[front]里面的数据取出来;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: