1.1 栈和队列的定义与特点
栈和队列同样是线性结构,其特殊性在于栈和队列的基本操作是线性表的子集,因而它们的操作有限
1.1.1 栈的定义和特点
栈是限定在表尾进行插入或删除操作的线性表
线性表的表尾对于栈来说称为栈顶,表头称为栈底,不含元素的栈称为空栈
栈的修改是按照后进先出的原则修改的
1.1.2 队列的定义和特点
队列是限定在表的一端进行插入,而在另一端进行删除元素
允许插入的一端称为队尾,允许删除的一端称为队头
队列的修改是按照先进先出的原则修改的
1.2
1.3栈的表示和操作的实现
1.3.1栈的类型定义
1.3.2顺序栈的表示和实现
顺序栈是指利用顺序储存结构实现的栈,即利用一组地址连续储存单元依次存放自栈底到栈顶的元素,指针top指示栈顶元素在顺序栈中的地址,指针base指示栈底在顺序栈中的地址
1,顺序栈的定义
#include MAXSIZE
typedef int selemtype(数据类型);
typedef struct
{
selemtype *top;
selemtype *base;
int stacksize;//栈可用的最大容量
}sqstack;
栈非时,top指向栈顶元素的上一个位置
2,初始化
顺序栈的初始化操作就是为顺序栈动态分配一个预定义大小的数组空间
算法实现
status(返回类型) initstack(sqstack &s)//创造一个空栈
{
s.base=new selemtype[MAXSIZE];//为顺序栈分配最大容量数组空间
if(!s.base) exit(0);//分配失败
s.top=s.base;//初始化top
s.stacksize=MAXSIZE;
return OK;
}
3,入栈
入栈操作就是在栈顶插入一个元素
(1)判断顺序栈是否满
(2)将新元素压入栈顶
(3)栈顶指针加一
算法实现
status push(sqstack &s,selemtype e)
{
if(s.top-s.base==s.stacksize) return error;//栈满
*s.top++=e;
return ok;
}
4,出栈
就是将栈顶元素删除
(1)判断栈是否为空
(2)栈顶指针减一
(3)栈顶元素出栈
算法描述
status pop(sqstack &s,selemtype &e){
if(s.top==s.base) return error;
e=*--s.top;
return ok;
}
5,取栈顶元素
当栈非空时,返回栈顶元素,占地该指针保持不变
selemtype gettop(sqstack s)
{
if(s.top!=s.base)
return *(s.top-1);
}
小结:由于顺序栈和顺序表一样,收到最大容量空间的限制,当达到最大限制时,就会操作麻烦,所以不确定栈可能达到的最大容量是,可以考虑使用链栈
1.3.3 链栈的表示和实现
链栈是指采用链式存储结构实现的栈,通常链栈采用单链表来表示
1,链栈的定义
typedef struct stacknode
{
elemtype data;
struct stacknode *next;
}stacknode ,*linkstack;
将链头作为头节点是比较方便的,而且没有必要像单链表一样为了操作方便附加一个头结点
2,初始化
链栈的初始化顺序栈的初始化基本一样,就是创造一个空栈 ,由于没有必要设置一个头结点,所以将栈顶置空
status initstack(linkstack &s)
{
s=NULL;
return OK;
}
3,入栈
和顺序栈的入栈操作不同的是,链栈在入栈之前不需要判断,栈是否已经满了,只需要为入栈元素动态分配一个节点空间
(1)为入栈元素分配空间,用指针P指向
(2)将新的节点域置为e
(3)将新的节点插入栈顶
(4)修改栈顶指针为p
status push(linkstack &s,selemtype e)
{
p=new stacknode;
p->next=data;
p->next=s;
s=p;
return ok;