上篇博客讨论了线性结构的两种基本的结构顺序表和链表,它们两者各有优缺点。总之吧,当我们要存储容量不固定的数据结构并且要对数据进行多次插入和删除操作时要多考虑使用链表结构,当只涉及对存储的数据进行只存或只读操作时应优先选用顺序表结构。
继续讨论线性结构--栈和队列
一、线性结构
1、栈
栈是一种特殊的线性表。它的结构非常类似于日常生活中的瓶子,只有一端开口,而插入和删除的操作只能在瓶子的瓶口处进行,这种一端开口是它的特殊性。这种特殊性也决定了栈中的数据操作顺序是先入后出的,也就是说先进入栈中的数据,最后才能出去。
栈的基本运算:
Note:栈是一种先进后出的线性表,但是并不意味着不会出现先进先出的情况。如:当1、2、3、4顺次入栈时,出栈的顺序也可能是1、2、3、4,这种情况发生条件是每个数入栈后出栈,然后下一个数入栈。即:1入栈后出栈,然后是2入栈后出栈,其次是3入栈后出栈,最后是4入栈后出栈,这样顺序就变成了1、2、3、4。
由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构。
1.1 顺序栈
在顺序栈中数据是按照顺序进行存储的。需要我们了解的是顺序栈中有上溢和下溢的概念。
上溢:栈顶指针指出栈的外面。我们把顺序栈看做一个盒子,那么当我们把数据放到这个栈中超过盒子的顶部时就放不下了,这时指针指向了栈的外面,这种现象我们称为上溢。
下溢:从空栈中取数据。当栈中没有数据时,我们再去取数据,看看没数据,把盒子拎起来看看盒底,还是没有,这就是下溢。
顺序栈的类型定义为:
#define stacksize 100
typedef char datatype;
typedef struct{
datatype data[stacksize];
int top;
}seqstack;
1.1.1 顺序栈的基本运算
(1) 置空栈
Void initstack(seqstack *s)
{
s->top=-1;
}