顺序表:允许随机访问

//顺序表的定义
typedef struct
{
	ElemType* elem;  //elem指向申请的堆空间的首元素地址
	int length;     //length表示表的长度,也即用来限制可以表中可以访问的元素个数
}SqList;	               //否则的话,由于申请的堆空间内每个元素都是可以访问的,
	               //那么表可能就会显示很多无关的元素

由顺序表引出顺序栈和顺序队的定义,因为顺序栈和顺序队都可以看作功能受限制的顺序表。

顺序栈:栈顶进出

typedef struct
{
	ElemType* base;   //base指向申请的堆空间的首元素地址
	ElemType* top;    //top指向栈顶元素的下一个地址
	int stacksize;    //stacksize表示顺序栈的容量
}SqStack;

顺序栈是由顺序表经过改变而来的,相较于顺序表,顺序栈增设了一个栈顶指针以及栈的容量,而去掉了表的长度。

(1)因为顺序栈始终只能访问栈顶元素,故需要增设一个栈顶指针来确定栈顶元素的位置。

(2)由于只能访问栈顶元素,故也不需要顺序表中的表长度这一属性。

(3)stacksize表示栈容量也是必要的,防止栈溢出造成栈顶指针非法访问。实际上,每次入栈都需要通过stacksize(是否stacksize==S.top-S.base)来判断是否栈满。

顺序队:头删尾插

typedef struct
{
	ElemType* base;  //base表示申请的堆空间的首元素地址
	int front; //front表示指向队首元素的伪指针
	int rear; // rear表示指向队尾元素的下个地址的伪指针
};

顺序队也可以看作是由顺序表经过改造而来的,也即功能受限且有特殊功能的顺序表。相较于顺序表来说,去掉了表的长度,而增加了队首指针以及队尾指针。由于队空与队满都会有front==rear,造成两者无法区分,故空出一个空间不能存储元素,且使队尾指针始终指向队尾元素的下个位置,这样rear==front时表示队空,++rear==front时表示队满。实际上,队尾指针与栈顶指针相似,入队与入栈的操作都是类似的。

那么为什么顺序队中要使用int类型的变量来起到指针的作用呢?其实也是可以使用指针来表示的,但使用int类型的变量来代替指针看起来比较方便,原因是在循环队列中,一旦front或rear指向堆空间的末尾位置,可以通过取模(front=(front+1)%MAXSIZE)的方式很方便使它们重新指向堆空间的首位置。