1. 什么是栈栈其实就是一种线性表。只不过它有点特殊,它的特殊性主要体现在它是一种后进先出(Last In First Out)的线性表,跟队列刚好相对应,队列刚好是先进先出(First In First Out)的在栈中只能在一端进行操作,就是说保存数据和取出数据只能从线性表的一端进行,一般地操作端我们称之为栈顶,另一端则称为栈底。2. 栈的基本操作栈的基本操作只有两个:
入栈(push):即将数据保存在栈顶。进行该操作前,先修改栈顶指针,使其向上移动一个元素位置,然后将数据保存在栈顶指针所指向的位置。
出栈(pop):即将栈顶的数据弹出,然后修改栈顶指针,使其指向栈中的下一个元素。
在栈中,只有栈顶元素是可以访问的。3. 两种栈一般地,栈使用两种存储表示方法。
顺序栈:使用一组连续的内存单元依次保存栈中的数据。一般情况下使用数组作为顺序栈,序号为0的元素就是栈底,再定义一个变量来保存栈顶的序号即可。
链式栈:使用链表形式来保存栈中个元素的值,链表尾部(指向地址NULL)为栈底,链表的首部(head指针所指向的元素)为栈顶。
两种栈的最大区别就是顺序栈是分布在一片连续的内存单元里,而链式栈一般是分布在零散的内存单元当中。接下来我们使用顺序栈来实现一个保存学生姓名和年龄的小实例。下面我们来一步一步的缕一下整个思路。1.要使用栈,那么我们首先应该定义一个栈结构
代码://定义顺序栈的结构
typedef struct stack
{
student data[SIZE+1]; //数据元素
int top; //栈顶
}SeqStack;
其中栈结构里面包含了2个元素,一个是结构体数组,数组名为data,其类型为student结构体,用来保存学生的姓名和年龄。另一个整形变量top用来表示栈顶的序号。2.定义好了栈结构,接下来就应该初始化栈。
代码://初始化栈
SeqStack * SeqStackInit()
{
SeqStack *p;
if (p = (SeqStack *)malloc(sizeof(SeqStack))) //申请栈内存
{
p->top = 0;
return p;
}
return NULL; //申请内存失败返回空值
}
顺