栈和队列的实现代码,栈和队列的实现实验总结
永远的神干货盘点
@TOC
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵循后进先出的原则。
注意从栈顶入,栈顶出
二、栈的实现(顺序表)
1.函数的定义和结构体的创建——堆栈
#杂注一次
#包含标准视频
#包含标准库
#包含标准布尔
#include assert.h
整型数据类型;
数据类型说明结构堆栈
数据类型* a;
栈顶
(同Internationalorganizations)国际组织容量;
void堆栈初始化(ST * p);
无效堆栈推进(ST* p,数据类型x);
int栈顶(ST * p);
无效堆栈弹出(ST * p);
int堆栈大小(ST * p);
bool stackempty(ST * p);
无效堆栈销毁(ST * p);
2.函数的调用——测试c
#includestack.h
int main()
意法半导体
堆栈初始化(ST);
stackpush( st,1);
stackpush( st,2);
stackpush( st,3);
stackpush( st,4);
而(!stackempty( st))//判断是否为空
printf(%d ,栈顶(ST));//出栈
堆栈弹出(ST);//移除栈顶元素
堆栈销毁(ST);//内存销毁
返回0;
}
3.栈的接口
1.初始化
void stackinit(ST* p)//栈的初始化
断言(p);
p-a=NULL
p-top=0;
p-容量=0;
}
无效堆栈推进(ST* p,数据类型x)//入栈
断言(p);
if (p- top==p- capacity)//扩容
int newcapacity=p- capacity==0?4 : 2 * p-容量;
datatype * tmp=(datatype *)realloc(p-a,sizeof(datatype)*新容量);
如果(tmp!=空)
p-a=tmp
p容量=newcapacity//扩容成原来的2倍
p-a[p-top]=x;
p-top;
}
3.移除栈顶元素
无效堆栈弹出(ST* p)//移除栈顶元素
断言(p);
断言(顶部
p-top-;
}
int stacktop(ST* p)//出栈
断言(p);
断言(顶部
返回p-a[p-top-1];//顶部从0开始,每次入栈顶端都向后移,所以前一名是实际储存的元素
}
5.判断为空
布尔堆栈属性(ST* p)//是否为空
return p-top==0;//当栈中没有数据时,则为空,为真,否则为假。
}
6.栈中元素个数
int stacksize(ST* p)//栈中元素个数
断言(p);
返回p- //虽然顶端是指向下一个,但是顶端从0开始,顶部正好是元素个数
}
7.内存销毁
无效堆栈销毁(ST* p)//内存销毁
断言(p);
免费(p- //销毁动态开辟数组
p-a=NULL
p-top=0;
p-容量=0;
}
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的原则。
入队列:进行插入操作的一段称为队尾
出队列:进行删除操作的一端称为对头
注意:对尾入,对头出
四、队列的实现(链表)
1.函数的定义和结构体的创建——队列。h
#杂注一次
#包含标准视频
#包含标准库
#include assert.h
#包含标准布尔
整型数据类型;
数据类型说明结构队列节点
数据类型数据;
结构队列节点*下一个
}队列节点
数据类型说明结构队列
队列节点*头
队列节点*尾部
}排队;
void队列init(queue * p);
void队列销毁(queue * p);
void队列推送(队列* p,数据类型x);
void队列弹出(queue * p);
数据类型队列前端(queue * p);
数据类型queue back(queue * p);
int队列大小(queue * p);
bool队列空(queue * p);
2.函数的调用——测试c
#包含" queue.h "
int main()
队列p;
队列初始化(
queuepush( p,1);
queuepush( p,2);
queuepush( p,3);
queuepush( p,4);
而(!queueempty( p))//判断为空
数据类型front=队列前端(
printf(%d ,front);
队列弹出(
queuedestroy( //内存销毁
返回0;
}
3.取一级指针的原因
正常来说,如果将头与尾巴放在队列节点内部,应该取二级指针,
但是由于此时定义的是结构体为长队的变量,改变的是该变量的内部。
所以只取一级指针就可以。
4.队列的接口的实现
1.初始化
void queueinit(queue* p)//初始化队列
断言(p);
p-head=NULL;
p-tail=NULL;
}
2.入队列
void queuepush(queue* p,数据类型x)//入队列(队尾入)
断言(p);
队列节点*新节点=(队列节点*)malloc(sizeof(队列节点));
新节点-数据=x;
new node-next=NULL;
if (p- tail==NULL)
p-tail=新节点;
p-head=新节点;
其他
p-tail-next=新节点;
p-tail=新节点;
}
3.删除数据
void queuepop(queue* p)//删除数据
断言(p);
断言(!队列空(p));//断言队列是否为空
队列节点* next=p-head-next;
免费(p头);
p-head=next;
if (p- head==NULL)//当删除只剩下最后一个节点时头与尾巴都指向,自由(头),尾巴就变成了野指针
p-tail=NULL;
}
4.取对头数据
数据类型队列前端(队列* p)//取队头数据
断言(p字头);
断言(!队列空(p));
返回p头数据;
}
5.取队尾数据
数据类型队列返回(队列* p)//取队尾数据
断言(p字头);
断言(!队列空(p));
返回p尾数据;
}
6.取队的元素个数
int queuesize(queue* p)//队的数量
断言(p);
int sum=0;
队列节点* cur=p-head;
而(cur!=空)
总和;
cur=cur-next;
返回总和;
}
7.判断为空
弯曲件队列空(队列* p)//判断队列是否为空
断言(p);
return p-head==NULL;
}
8.内存销毁
void queuedestroy(queue* p)//内存销毁
断言(p);
队列节点* cur=p-head;
而(cur!=空)
队列节点* next=cur-next;
免费(cur);
cur=下一个
p-head=NULL;
p-tail=NULL;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。