建立堆栈和队列的库函数
摘要
堆栈是一种只允许在表的一端进行插入和删除运算的特殊的线性表。
链式存储结构:栈的链式存储结构称为链栈,通常用单链表示。
链栈的插入和删除操作只需处理栈顶的情况。
每次进栈的数据元素都放在原当前栈顶元素之前成为新的栈顶元素,每次退栈的数据元素都是原当前栈顶元素,最后进入堆栈的数据元素总是最先退出堆栈。
队列是允许在表的一端进行插入,而在表的另一端进行删除的特殊线性表。
允许进行插入的一端称为队尾,允许进行删除的一端称为队头。
用链式存储结构存储的队列称为链队列。
链队列的基本操作的实现基本上也是单链表操作的简化。
通常附设头结点,并设置队头指针指向头结点,队尾指针指向终端结点。
插入数据时只考虑在链队列的尾部进行,删除数据时只考虑在链队列的头部进行。
关键词:堆栈;队列;线性表;存储结构
第1章前言
栈和队列是两种常用的数据结构,广泛应用在编译软件和程序设计,操作系统、事物管理等各类软件系统中。
从数据结构角度看,栈和队列是受限制的线性表,栈和队列的数据元素具有单一的前驱和后继的线性关系;从抽象数据类型角度看,栈和队列又是两种重要的抽象数据类型。
第2章堆栈和队列定义
2.1 定义
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。
它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。
允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。
插入一般称为进栈(PUSH),删除则称为退栈(POP)。
栈也称为后进先出表。
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”的线性表。
2.2 队列基本操作
2.2.1栈的建立和初始化:
voidInitStack(SqStack * &s)
{
s=(SqStack * )malloc(sizeof(SqStack)); s->top=-1;
}
2.2.2入栈函数及操作:
bool Push(SqStack * &s,int e)
{
if(s->top==MaxSize-1)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
2.2.3出栈函数及操作:
bool Push(SqStack * &s,int e)
{
if(s->top==MaxSize-1)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
2.2.4取栈顶元素操作:boolGetTop(SqStack * &s,int&e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
return true;
}
第3章堆栈和队列的实现方法
栈的链接存储结构与线性表的链接存储结构相同,是通过由结点构成的单链表实现的,此时表头指针称为栈顶指针,由栈顶指针指向的表头结点称为栈顶结点,整个单链表称为链栈,即链接存储的栈。
当向一个链栈插入元素时,是把该元素插入到栈顶,即使该元素结点的指针域指向原来的栈顶结点,而栈顶指针则修改为指向该元素结点,使该结点成为新的栈顶结点。
当从一个链栈中删除元素时,是把栈顶元素结点删除掉,即取出栈顶元素后,使栈顶指针指向原栈顶结点的后继结点。
由此可知,对链栈的插入和删除操作是在单链表的表头进行的,其时间复杂度为O(1)。
在队列的形成过程中,可以利用线性链表的原理,来生成一个队列。
基于链表的队列,要动态创建和删除节点,效率较低,但是可以动态增长。
队列采用的“先进先出”,新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。
每次读取一个元素,释放一个元素。
所谓的动态创建,动态释放。
因而也不存在溢出等问题。
由于链表由结构体间接而成,遍历也方便。
3.1堆栈的流程图
3.2分析功能
堆栈:
(1)初始化链栈(2)链栈置空(3)入栈
(4)出栈
(5)遍历链栈
3.3堆栈的源代码
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10000 typedefstruct
{
int data[MaxSize];
int top;
}SqStack;
voidInitStack(SqStack * &s)
{
s=(SqStack * )malloc(sizeof(SqStack)); s->top=-1;
}
boolStackEmpty(SqStack *s)
{
return(s->top==-1);
}
bool Push(SqStack * &s,int e)
{
if(s->top==MaxSize-1)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
bool Pop(SqStack * &s,int&e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
}
boolGetTop(SqStack * &s,int&e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
return true;
}
int main()
{
intn,i,inys,ding,outys;
SqStack *l;
InitStack(l);
printf("输入进栈元素个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("输入第%d个进栈元素:",i+1);
scanf("%d",&inys);
Push(l,inys);
}
GetTop(l,ding);
printf("栈顶元素为:%d\n",ding);
for(i=0;i<n;i++)
{
Pop(l,outys);
printf("%d \n",outys);
if(StackEmpty(l))
{
printf(" 为空栈\n");
}
else
{
printf("不为空栈\n");
}
}
return 0;
}
3.4测试与运行
结语
栈和队列是两种常用的数据结构,广泛应用在编译软件和程序设计,操作系统、事物管理等各类软件系统中。
从数据结构角度看,栈和队列是受限制的线性表,栈和队列的数据元素具有单一的前驱和后继的线性关系;从抽象数据类型角度看,栈和队列又是两种重要的抽象数据类型。
通过本次的数据结构实验,我掌握了堆栈和队列的基本操作以及实现他们的算法,对他们有了一个更加具体、深刻的认识,帮助以后解决实际问题。
掌握了这一系列的方法,会为我们今后的继续学习带来很大的帮助。
参考文献
[1]《数据结构(C语言版)》严蔚敏吴伟民编著清华大学出版社。