第三章栈和队列——3.1:栈
我们开始栈和队列的学习。
我们先开始学习栈。栈也是一种线性表。不过栈是从下往上放的,我们可以想象一个箱子,元素就是一本本书,我们在放书的时候先放的书都是放在最下面的,而在取书的时候,先取得书都是上面的,所以栈的元素有后进先出的特点,对于栈来说最上面的元素称为栈顶,最下面的元素称为栈底。不含元素的栈称为空栈
因为栈也是一种线性表,所以栈的程序和上一张的线性表类似。在这里我们先了解栈的第一种存储结构,顺序存储。
对于栈的顺序存储我们的模板如下
#define chushi 100
#define zengjia 10
typedef struct
{
selemtype* base;
selemtype* top;
int stacksize;
}a;
对于部分基本算法的描述如下
构建一个空栈
Status initstack(a& s)
{
s.base = (selemtype*)malloc(chushi * sizeof(selemtype));
if (!s.base) exit(overflow);
s.top = s.base;
s.stacksize = chushi;
return ok;
}
若栈不空,则用e返回s的栈顶元素,若为空返回error
Status gettop(a& s,selemtype &e)
{
if (s.top = s.base) return error;
e = *(s.top - 1);
return ok;
}
插入新的元素e为栈顶
Status push(a& s,selemtype e)
{
if (s.top - s.base >= s.stacksize)
{
s.base = (selemtype*)realloc(s.base, (s.stacksize + zengjia) * sizeof(selemtype));
if (!s.base)exit(overflow);
s.top = s.base + s.stacksize;
s.stacksize += zengjia;
}
*s.top++ = e;
return ok;
}
若栈不空,删除栈顶元素赋值给e。
Status pop(a& s,selemtype& e)
{
if (s.top == s.base)return error;
e = *--s.top;
return ok;
}