数据结构中队列与栈的区别,从数据结构定义看,栈和队列都是
这个还是目录栈栈的实现队列队列的实现最后
(我老婆镇楼)
菜鸡大学生摸了一个星期的鱼,又回来写博客了。
其实是在忙程序设计作业。(顺便摸了一个星期的鱼)
总之先把栈和队列写完。
栈啥是栈呢?
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出后进先出法的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
栈的实现栈可以由链表或者顺序表去实现,由于只在尾部进行操作,所以我们选择使用顺序表实现。
又由于我们写过顺序表,我们就直接贴代码吧。
# define _ CRT _ SECURE _ NO _ WARNINGS 1
#包含标准视频
#include assert.h
#包含标准布尔
typedef int STDataType
数据类型说明结构堆栈
{
标准数据类型*数组
int top//栈顶的位置
(同Internationalorganizations)国际组织容量;//容量
} ST
//栈初始化
无效堆栈单位(ST* ps)
{
assert(PS);
PS-arr=NULL;
ps-容量=0;
PS-top=0;
}
//销毁栈
无效堆栈库存
{
assert(PS);
免费(PS-arr);
PS-arr=NULL;
ps-容量=0;
PS-top=0;
}
//入栈
void StackPush(ST* ps,STDataType x)
{
assert(PS);
如果(ps- top==ps- capacity)
{
int newcapacity=ps- capacity==0?4 : ps-容量* 2;
stdata type * tmp=(stdata type *)realloc(PS-arr,new capacity * sizeof(stdata type));
if (tmp==NULL)
{
printf(失败!);
退出(-1);
}
其他
{
PS-arr=tmp;
PS-容量=新容量;
}
}
PS-arr[PS-top]=x;
PS-top;
}
//出栈
无效堆栈弹出(ST* ps)
{
assert(PS);
断言(PS-top 0);
PS-top-;
}
//判断栈是否为空
布尔堆栈
{
assert(PS);
return PS-top==0;
}
//栈的大小
(同Internationalorganizations)国际组织堆栈大小(ST* ps)
{
assert(PS);
返回PS-top;
}
//返回栈顶元素
标准数据类型堆栈顶部(ST* ps)
{
assert(PS);
断言(PS-top 0);
返回PS-arr[PS-top-1];
}队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。
队列具有先进先出先进先出的原则
入队列:进行插入操作的一端称为队尾。
出队列:进行删除操作的一端称为队头。
队列的实现这次我们使用链表来实现队列。
(如果使用数组的话出队列在数组头上出数据,效率会比较低)
老样子,直接上代码:
# define _ CRT _ SECURE _ NO _ WARNINGS 1
#包含标准视频
#include assert.h
#包含标准布尔
typedef int QDataType
数据类型说明结构节点
{
QDataType数据;
结构QNode *下一步
} QNode
数据类型说明结构队列
{
QNode * head
QNode * tail
}排队;
//队列的初始化
void QueueInit(Queue* pq)
{
断言(pq);
pq-head=pq-tail=NULL;
}
//销毁队列
void QueueDestory(Queue* pq)
{
断言(pq);
QNode * cur=pq-head;
while (cur)
{
QNode * next=cur-next;
免费(cur);
cur=下一个
}
pq-head=pq-tail=NULL;
}
//入队
void QueuePush(Queue* pq,QDataType x)
{
断言(pq);
QNode * new node=(QNode *)malloc(sizeof(QNode));
断言(新节点);
新节点-数据=x;
new node-next=NULL;
if (pq- tail==NULL)
{
assert(pq-head==NULL);
pq-head=pq-tail=新节点;
}
其他
{
pq-tail-next=新节点;
pq-tail=新节点;
}
}
//出队
void队列弹出(队列* pq)
{
断言(pq);
assert(pq-tail pq-head);
if (pq- head- next==NULL)
{
免费(pq-head);
pq-head=pq-tail=NULL;
}
其他
{
q node * next=pq-head-next;
免费(pq-head);
pq-head=next;
}
}
//判断队列是否为空
布尔队列空(队列* pq)
{
断言(pq);
return pq-head==NULL;
}
//队列长度
尺寸_t队列大小(队列* pq)
{
断言(pq);
QNode * cur=pq-head;
int count=0;
while (cur)
{
数数;
cur=cur-next;
}
返回计数;
}
//返回队头元素
QDataType队列前端(队列* pq)
{
断言(pq);
断言(pq-head);
返回pq-head-data;
}
//返回队列元素的尾部
QDataType队列返回(Queue* pq)
{
断言(pq);
断言(pq-tail);
返回pq-tail-data;
}最后感觉文笔比双链表更水…
堆栈和队列。我感觉标题才是本质。
Emmm,写下一个题目。
毕竟这一周真的太忙了。
拜拜。
(立个旗,以后我每周画一幅。)
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。